我的代码和Class2的列表中有这两个类.我想组列表中的元素通过date
和ID
使用LINQ.
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;
}
Run Code Online (Sandbox Code Playgroud)
我的清单与此类似:
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 } } },
};
Run Code Online (Sandbox Code Playgroud)
很抱歉,如果这是一个愚蠢的问题,但我是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;
Run Code Online (Sandbox Code Playgroud)
由于我在分组中有硬编码索引0,因此我在最终列表中遗漏了很多元素.如何为列表a
中的所有元素执行此操作Class2
?
预期输出与此类似:
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}}
Run Code Online (Sandbox Code Playgroud)
你的问题指出:
由于我在分组中硬编码了索引 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;
Run Code Online (Sandbox Code Playgroud)
由于每个嵌套对象没有p
和q
属性,但您的代码显示访问我使用的嵌套项目,y
而z
不是
这也可以使用方法语法来完成。要展平嵌套集合,请使用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 });
Run Code Online (Sandbox Code Playgroud)
尽管它看起来只是出于问题目的,但我建议为属性和变量提供有意义的名称并查看:
归档时间: |
|
查看次数: |
158 次 |
最近记录: |