C# 如何按嵌套列表分组?

C# 如何按嵌套列表分组?,c#,C#,我有一个对象列表,每个对象都包含一个字符串列表,我想使用在列表中包含相同值的组对象。 我正在尝试类似的东西,但它把它们都放在同一个列表中 List<Item> Items = new List<Item>(); Item Item1 = new Item(); Item1.Id = "1"; Item1.Names.AddRange(new List<string> { "A" }); Items.Add(Item1); Item Item2 = new I

我有一个对象列表,每个对象都包含一个字符串列表,我想使用在列表中包含相同值的组对象。 我正在尝试类似的东西,但它把它们都放在同一个列表中

List<Item> Items = new List<Item>();
Item Item1 = new Item();
Item1.Id = "1";
Item1.Names.AddRange(new List<string> { "A" });
Items.Add(Item1);

Item Item2 = new Item();
Item2.Id = "2";
Item2.Names.AddRange(new List<string> { "B" });
Items.Add(Item2);

Item Item3 = new Item();
Item3.Id = "3";
Item3.Names.AddRange(new List<string> { "A", "C" });
Items.Add(Item3);

List<List<Item>> GroupedItems = Items.GroupBy(u => u.Names.GroupBy(s => s)).Select(t => t.ToList()).ToList();
List Items=newlist();
Item Item1=新项();
项目1.Id=“1”;
Item1.Names.AddRange(新列表{“A”});
增加(第1项);
Item Item2=新项();
项目2.Id=“2”;
Item2.Names.AddRange(新列表{“B”});
增加(第2项);
Item Item3=新项目();
项目3.Id=“3”;
Item3.Names.AddRange(新列表{“A”,“C”});
增加(第3项);
列出GroupedItems=Items.GroupBy(u=>u.Names.GroupBy(s=>s)).Select(t=>t.ToList()).ToList();
在这个场景中,我希望发生的是
GroupedItems
包含两个列表,第一个包含
Item1
Item3
,第二个包含
Item2

列表GroupedItems=Items
List<List<Item>> GroupedItems = Items
    // Select only distinct names that can occur
    .SelectMany(x => x.Names).Distinct()
    // For every unique name find items that have it in Names
    .Select(name => Items.Where(x => x.Names.Contains(name)).ToList())
    .ToList();
//仅选择可能出现的不同名称 .SelectMany(x=>x.Names).Distinct() //对于每个唯一的名称,查找名称中包含该名称的项 .Select(name=>Items.Where(x=>x.Names.Contains(name)).ToList()) .ToList();
列出GroupedItems=项目
//仅选择可能出现的不同名称
.SelectMany(x=>x.Names).Distinct()
//对于每个唯一的名称,查找名称中包含该名称的项
.Select(name=>Items.Where(x=>x.Names.Contains(name)).ToList())
.ToList();

仍不清楚您想要完成什么。当您想要使用LINQ
GroupBy
操作时,您应该提供一个
keySelector
函数,该函数将为集合中的每个项目生成键对象。然后,具有相同键对象的所有项都将分组在一起。假设您有
item1.Names={“A”,“B”}
item2.Names={“A”,“C”}
item3.Names={“B”,“C”}
。在这种情况下,您希望收到什么?@IvanGritsenko我只希望列表中具有类似值的项目被分组在一起。同一个项目是否出现在多个组中并不重要。谢谢。所以您希望在所有项目中遇到的每个字符串值都有一个单独的组,对吗?对于您的示例,您希望结果有3个组:
表示“A”:item1、item3
表示“B”:item2
表示“C”:item3
。我说得对吗?是的,没错。仍然不清楚我们想要实现什么。当您想要使用LINQ
GroupBy
操作时,您应该提供一个
keySelector
函数,该函数将为集合中的每个项目生成键对象。然后,具有相同键对象的所有项都将分组在一起。假设您有
item1.Names={“A”,“B”}
item2.Names={“A”,“C”}
item3.Names={“B”,“C”}
。在这种情况下,您希望收到什么?@IvanGritsenko我只希望列表中具有类似值的项目被分组在一起。同一个项目是否出现在多个组中并不重要。谢谢。所以您希望在所有项目中遇到的每个字符串值都有一个单独的组,对吗?对于您的示例,您希望结果有3个组:
表示“A”:item1、item3
表示“B”:item2
表示“C”:item3
。我说得对吗?是的,没错。