首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ过滤List<Contract>中的第一项

使用LINQ过滤List<Contract>中的第一项
EN

Stack Overflow用户
提问于 2020-08-23 18:47:33
回答 2查看 108关注 0票数 0

我有一个var contracts = new List<Contract>();,它是在特定时间框架内编写的所有合同的主列表。契约对象如下所示:

代码语言:javascript
复制
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. All "first“合同--这意味着如果只与一家公司签订一份合同,它就会进入我的产出。如果同一家公司有多个合同,那么我会选择一个最小/最老的ContractDate
  2. I,也需要生成一个与第一个相反的列表,这意味着,我需要在我的输出中包括所有的第二,第三,等等。如果只与一家公司签订一份合同,我会将其包括在我的产出中,但如果我与一家公司有多项合同,我将跳过第一份合同,将其余的合同包含在我的输出中。

我可以使用foreach循环来实现这一点,但我想看看如何使用LINQ生成相同的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-23 20:04:00

对于第一个,我相信这可以。

代码语言:javascript
复制
contracts
    .GroupBy(c => c.CompanyId)
    .Select(c => c.OrderBy(o => o.ContractDate).First());

至于第二个问题:

代码语言:javascript
复制
contracts
    .GroupBy(c => c.CompanyId)
    .Select(c => c.OrderBy(o => o.ContractDate).Skip(c.Count() == 1 ? 0 : 1))
    .SelectMany(c => c)
票数 2
EN

Stack Overflow用户

发布于 2020-08-23 19:58:23

到目前为止,我已经做了第一个,但并不像预期的那样容易。

代码语言:javascript
复制
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
                };

为了测试,

代码语言:javascript
复制
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; }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63550816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档