如何以这种方式遍历该列表?

6
我有一个对象列表,长这样:

ID:2000
Title:"Title 1"
Description:"My name is Marco"

ID:2000
Title:"Title 2"
Description:"My name is Luca"

ID:3000
Title:"Title 3"
Description:"My name is Paul"

ID:4000
Title:"Title 4"
Description:"My name is Anthony"

ID:4000
Title:"Title 5"
Description:"My name is Carl"

ID:4000
Title:"Title 6"
Description:"My name is Jadett"

现在,我想用for each遍历它。但我想从相同的ID开始遍历。因此,首先对于单个/唯一ID(2000、3000、4000等),使用foreach(共3个步骤)。然后,对于每个“ID”步骤,对于每个Title/Description:因此,对于ID 2000有2个步骤,对于ID 3000有1个步骤,对于ID 4000有3个步骤。列表按ID排序。

我该怎么做?分组?嗯...

4个回答

8

是的,使用group by:

foreach (var group in items.GroupBy(i => i.ID))
{
    foreach (var item in group)
    {
    } 
}

但这不是 OP 所要求的。"首先使用 foreach 循环单个/唯一 ID...然后对于每个“ID”..."。这个顺序会有所不同。首先是组,然后是所有项目,然后是下一个组等等。 - Tim Schmelter
@TimSchmelter,根据他的写法,“第一个foreach”应该有三个步骤。使用您的描述会变成六个步骤。 - Amiram Korach
不,OP想要先枚举组,因此有三个步骤,因为有三个不同的ID。然后他想要枚举相应的项目(所以1. ID=2000,两个元素,2. ID=3000,一个元素,3.ID=4000,三个元素)。如果您愿意,可以查看我的答案 - Tim Schmelter
@markzzz:顺序不同,我已经提到了。Amiram的方法有一个嵌套的foreach,而我的方法有连续的foreachs。您要求的是:“首先是2000、3000、4000,所以有3个步骤,然后是ID 2000的2个步骤,ID 3000的1个步骤和ID 4000的3个步骤。”上面的代码执行以下操作:“首先是2000,然后是ID 2000的2个步骤,然后是3000和ID 3000的1个步骤,最后是4000和ID 4000的3个步骤”。 - Tim Schmelter
没有3个步骤(主要步骤),每个步骤内部有2-1和3个步骤 :) - markzzz
显示剩余2条评论

1

是的,您可以使用 GroupBy

首先是分组本身:

var idGroups = items.GroupBy(i => i.ID).ToList(); // omit ToList() if scalability is more important than performance since it creates a new list but doesn't enables to enumerate the result multiple times without querying again
foreach(var idGroup in idGroups)
{
    // ...
}

然后对每个组中的所有项目进行操作:

foreach (var idGroup in idGroups)
{
    foreach (var item in idGroup)
    {
        // ...
    } 
}

1
你仍然缺少一些 var (foreach (idGroup in ...)).(顺便说一下,这是我认为最接近 OP 想要的代码。) - Rawling
@Rawling:我应该尝试编译甚至最简单的东西;) 谢谢。 - Tim Schmelter

0

如果我理解你的意思正确,首先获取一个唯一的ID列表,然后逐个循环处理。

foreach(var id in objectList.Select(x => x.ID).Distinct())
{
    foreach(var item in objectList.Where(x => x.ID = id))
    {
        DoSomething(item);
    }
}

编辑:Amiram Korach的回答更好-使用GroupBy。我的代码执行相同的功能,只是更冗长 :)


0
为什么要使用groupby,而不是使用sort?我已经用元组做过这个操作,但你可以根据自己的数据结构进行替换。如果你想对分组进行聚合操作,那么使用Group By非常有用。但如果你只是想排序和遍历,那么直接使用sort即可。
var list = new List<Tuple<int, string, string>>();
list.Add(Tuple.Create(4000,"Title 5", "My name is Carl"));
list.Add(Tuple.Create(2000,"Title 1", "My name is Marco"));
list.Add(Tuple.Create(4000,"Title 6", "My name is Jadett"));
list.Add(Tuple.Create(3000,"Title 3", "My name is Paul"));
list.Add(Tuple.Create(4000,"Title 4", "My name is Anthony"));
list.Add(Tuple.Create(2000,"Title 2", "My name is Luca"));

var sorted = list.OrderBy(k => k.Item1).
                  ThenBy(k => k.Item2).
                  ThenBy(k => k.Item3);

foreach (var k in sorted)
{
    Console.WriteLine(k);
}

结果是

(2000, Title 1, My name is Marco)
(2000, Title 2, My name is Luca)
(3000, Title 3, My name is Paul)
(4000, Title 4, My name is Anthony)
(4000, Title 5, My name is Carl)
(4000, Title 6, My name is Jadett)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接