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、つまり 3 ステップ) の foreach を実行します。各「ID」ステップでは、各タイトル/説明: ID 2000 の場合は 2 ステップ、ID 3000 の場合は 1 ステップ、ID 4000 の場合は 3 ステップです。リストは ID 順に並べられています。

どうすればいいですか?グループ化?うーん...

4

4 に答える 4

8

はい、グループ化:

foreach (var group in items.GroupBy(i => i.ID))
{
    foreach (var item in group)
    {
    } 
}
于 2012-11-15T10:33:02.207 に答える
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)
    {
        // ...
    } 
}
于 2012-11-15T10:40:00.677 に答える
0

sort を使用できるのに、なぜ 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);
}

結果は

(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)
于 2012-11-15T10:54:49.280 に答える
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ください。私のものはまったく同じ機能を実行しますが、より冗長です:)

于 2012-11-15T10:33:58.617 に答える