繁体   English   中英

在C#中使用LINQ进行分组需要帮助

[英]Need help in a grouping using LINQ in C#

我的代码和Class2的列表中有这两个类。 我想使用LINQ按dateID对列表元素进行分组。

public class Class1
{
    public string ID;
    public int y;
    public int z;
}

public class Class2 
{
    public List<Class1> a;
    public int p, q;
    public string s;
    public DateTime date;
}

我的清单与此类似:

List<Class2> object1 = new List<Class2>
{
    new Class2 {p = 5, q = 6, date = DateTime.Now, a = new List<Class1> { new Class1 { ID = "3643746HDJ", y = 0, z = 9 }, new Class1 { ID = "746327846HDJ", y = 0, z = 9 } } },
    new Class2 {p = 5, q = 6, date = DateTime.Now.AddDays(1), a = new List<Class1> { new Class1 { ID = "3643746HDJ", y = 0, z = 9 }, new Class1 { ID = "746327846HDJ", y = 0, z = 9 } } },
    new Class2 {p = 5, q = 6, date = DateTime.Now.AddDays(2), a = new List<Class1> { new Class1 { ID = "3643746HDJ", y = 0, z = 9 }, new Class1 { ID = "746327846HDJ", y = 0, z = 9 } } },
    new Class2 {p = 5, q = 6, date = DateTime.Now.AddDays(3), a = new List<Class1> { new Class1 { ID = "3643746HDJ", y = 0, z = 9 }, new Class1 { ID = "746327846HDJ", y = 0, z = 9 } } },
};

很抱歉,如果这是一个愚蠢的问题,但我是C#编程和LINQ的初学者,我不确定这是否可能。

这是我根据我在网上看到的例子尝试的,但它不正确

var newList = from item in object1
              group new
              {
                  item.s,
                  item.a[0].x, //I think its wrong because of this
                  item.a[0].y  //and this
              }
              by new
              {
                  item.date,
                  item.a[0].ID  //and this
              }
              into temp
              select temp;

由于我在分组中有硬编码索引0,因此我在最终列表中遗漏了很多元素。 如何对Class2中列表a所有元素执行此操作?

预期输出与此类似:

Key: {date: 19-09-2017 ID: 3643746HDJ}, Element: {{s: "abc", y = 1, z = 2}, {s: "pqr", y = 2, z = 4}, {s: "abc", y = 1, z = 2}}
Key: {date: 20-09-2017 ID: 3643746HDJ}, Element: {{s: "pop", y = 1, z = 2}, {s: "dfr", y = 2, z = 4}, {s: "abc", y = 1, z = 2}}
Key: {date: 19-09-2017 ID: 746327846HDJ}, Element: {{s: "abc", y = 7, z = 8}, {s: "asar", y = 2, z = 111}, {s: "abc", y = 1, z = 2}}
Key: {date: 20-09-2017 ID: 746327846HDJ}, Element: {{s: "abc", y = 7, z = 8}, {s: "asar", y = 2, z = 111}, {s: "abc", y = 1, z = 2}}

你的问题陈述:

由于我在分组中有硬编码索引0,因此我在最终列表中遗漏了很多元素 如何对Class2中列表a的所有元素执行此操作?

如果您想要嵌套集合中的所有项目,则需要在分组之前展平嵌套集合。 在查询语法中,使用另一个from

var result = from item in object1
             from nested in item.a
             group new { item.s, nested.y, nested.z } by new { item.date, nested.ID } into g
             select g;

由于每个嵌套对象都没有pq属性,但是您的代码显示访问嵌套项,而是使用yz

这也可以使用方法语法完成。 要展平嵌套集合,请使用SelectMany 对于GroupBy您可以使用指定键和元素选择器的重载。 一般的想法:

var result = object1.SelectMany(item => item.a.Select(nested => new {item, nested }))
                    .GroupBy(key => new { key.item.Date, key.nested.Id },
                             val => new { val.item.s, val.nested.x, val.nestd.y });

即使它似乎只是出于问题目的,我建议为属性和变量提供有意义的名称,并查看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM