Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以这种方式遍历此列表?_C#_Linq_List_Foreach - Fatal编程技术网

C# 如何以这种方式遍历此列表?

C# 如何以这种方式遍历此列表?,c#,linq,list,foreach,C#,Linq,List,Foreach,我有一个如下所示的对象列表: 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 Tit

我有一个如下所示的对象列表:

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的foreach(2000、3000、4000、So 3个步骤)。然后,对于每个“ID”步骤,每个标题/描述:ID 2000有2个步骤,ID 3000有1个步骤,ID 4000有3个步骤。列表按ID排序

我怎么做?分组?嗯…

是的,有一组人:

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

如果我理解正确的话,首先获取一个不同的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
。Mine执行完全相同的功能,只是更详细:)

是的,您可以使用
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)
    {
        // ...
    } 
}

既然可以使用排序,为什么还要使用groupby?我已经用Tuple做了这个,但是用你选择的结构代替。如果要对组执行聚合操作,则Group By非常有用。您只需要排序和遍历

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);
}

但不是OP要求的。“首先是单个/唯一ID的foreach…然后是每个“ID”…”。这个顺序会有所不同。首先是小组,然后是所有项目,然后是下一组等等。@TimSchmelter,“第一个foreach”应该是他写的3个步骤。根据您的描述,这将是6个步骤。不,OP希望首先枚举组,因此需要3个步骤,因为有三个不同的ID。然后他想列举适当的项目(因此1.ID=2000,两个元素,2.ID=3000,一个元素,3.ID=4000,三个元素)。如果你愿意,你可以看看。@AmiramKorach是我需要的!谢谢大家!@蒂姆施梅尔特:我的问题中有什么不清楚?您的代码看起来与Amiram One相同您仍然缺少几个
var
s(
foreach(idGroup in…
)。(顺便说一句,这不是我的DV;我认为这与OP想要的最接近。)@Rawling:我应该试着编译最简单的东西;)谢谢
(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)