如何解决使用LINQ过滤List <Contract>中的第一项
我有一个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
的合同都是唯一的。
我的任务是生产:
- 所有“第一份”合同,这意味着如果与一家公司只有一份合同,它将输入我的输出中。如果同一家公司有多份合同,那么我会选择{/ {1}}最小/历史最早的
- 我还需要生成一个与第一个相反的列表,这意味着我需要在输出中包括所有第二个,第三个等合同。如果与公司的合同只有一个,则将其包含在我的输出中,但是如果我与公司的多个合同,则将跳过第一个,并将其余的都包含在我的输出中。
我可以使用ContractDate
循环执行此操作,但想了解如何使用foreach
产生相同的结果。
解决方法
我相信第一个会做到
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)
,
直到现在,我已经完成了第一个操作,尽管并不像预期的那样容易。
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,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,ContractDate = new DateTime(2020,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,} into ag
from x in ag.Group
where x.ContractDate == ag.Max
select new
{
CompanyId = x.CompanyId,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; }
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。