我有一个var contracts = new List<Contract>();,它是在特定时间框架内编写的所有合同的主列表。契约对象如下所示:
public class Contract
{
public int Id { get; set; }
public int CompanyId { get; set; }
public string CompanyName { get; set; }
public DateTime ContractDate { get; set; }
public decimal Amount { get; set; }
}主列表可能包含或不包含与同一家公司的多个合同,因此并非所有的CompanyId都是唯一的。
我的任务是制作:
ContractDate我可以使用foreach循环来实现这一点,但我想看看如何使用LINQ生成相同的结果。
发布于 2020-08-23 20:04:00
对于第一个,我相信这可以。
contracts
.GroupBy(c => c.CompanyId)
.Select(c => c.OrderBy(o => o.ContractDate).First());至于第二个问题:
contracts
.GroupBy(c => c.CompanyId)
.Select(c => c.OrderBy(o => o.ContractDate).Skip(c.Count() == 1 ? 0 : 1))
.SelectMany(c => c)发布于 2020-08-23 19:58:23
到目前为止,我已经做了第一个,但并不像预期的那样容易。
var results =
from kvp in list
group kvp by kvp.CompanyId into g
select new
{
Group = g,
Max = g.Max(kvp => kvp.ContractDate),
} into ag
from x in ag.Group
where x.ContractDate == ag.Max
select new
{
CompanyId = x.CompanyId,
Amount = x.Amount,
ContractDate = ag.Max,
CompanyName = x.CompanyName
};为了测试,
public static void Main()
{
var c1 = new Contract { Id = 1, CompanyId = 1000, CompanyName = "ABC", Amount = 1337, ContractDate = new DateTime(2000, 12, 30)};
var c2 = new Contract { Id = 2, CompanyId = 1001, CompanyName = "XYZ", Amount = 97, ContractDate = new DateTime(2001, 12, 30)};
var c3 = new Contract { Id = 3, CompanyId = 2222, CompanyName = "iQuest", Amount = -999, ContractDate = new DateTime(1994, 1, 1)};
var c4 = new Contract { Id = 4, CompanyId = 2222, CompanyName = "iQuest", Amount = -999, ContractDate = new DateTime(2020, 1, 1)};
var list = new List<Contract> { c1, c2, c3, c4 };
var results =
from kvp in list
group kvp by kvp.CompanyId into g
select new
{
Group = g,
Max = g.Max(kvp => kvp.ContractDate),
} into ag
from x in ag.Group
where x.ContractDate == ag.Max
select new
{
CompanyId = x.CompanyId,
Amount = x.Amount,
ContractDate = ag.Max,
CompanyName = x.CompanyName
};
}
// Define other methods, classes and namespaces here
public class Contract
{
public int Id { get; set; }
public int CompanyId { get; set; }
public string CompanyName { get; set; }
public DateTime ContractDate { get; set; }
public decimal Amount { get; set; }
}https://stackoverflow.com/questions/63550816
复制相似问题