LINQ でのグループ化 質問する

LINQ でのグループ化 質問する

次のようなクラスがあるとします。

class Person { 
    internal int PersonID; 
    internal string car; 
}

このクラスのリストは以下のとおりです:List<Person> persons;

また、このリストには同じ を持つ複数のインスタンスが含まれる場合がありますPersonID。次に例を示します。

persons[0] = new Person { PersonID = 1, car = "Ferrari" }; 
persons[1] = new Person { PersonID = 1, car = "BMW"     }; 
persons[2] = new Person { PersonID = 2, car = "Audi"    }; 

PersonID彼が所有するすべての車をグループ化してリストを取得する方法はありますか?

例えば、期待される結果は

class Result { 
   int PersonID;
   List<string> cars; 
}

グループ化すると次のようになります。

results[0].PersonID = 1; 
List<string> cars = results[0].cars; 

result[1].PersonID = 2; 
List<string> cars = result[1].cars;

これまで私がやってきたことは以下の通りです。

var results = from p in persons
              group p by p.PersonID into g
              select new { PersonID = g.Key, // this is where I am not sure what to do

誰か私に正しい方向を指し示してくれませんか?

ベストアンサー1

そうです。基本的には次のことが必要です。

var results = from p in persons
              group p.car by p.PersonId into g
              select new { PersonId = g.Key, Cars = g.ToList() };

または、非クエリ式として:

var results = persons.GroupBy(
    p => p.PersonId, 
    p => p.car,
    (key, g) => new { PersonId = key, Cars = g.ToList() });

基本的に、グループの内容 ( として表示する場合)は、指定されたキーに対して存在するIEnumerable<T>投影 (この場合は) 内の値のシーケンスです。p.car

仕組みの詳細についてはGroupBy、私のEdulinqのトピックに関する投稿

(上記の をPersonID変更しました。PersonId.NET 命名規則(「複合語と一般用語の大文字化」セクションで具体的にこの点について説明しています。)

あるいは、以下を使用することもできますLookup:

var carsByPersonId = persons.ToLookup(p => p.PersonId, p => p.car);

すると、各人用の車を簡単に入手できます。

// This will be an empty sequence for any personId not in the lookup
var carsForPerson = carsByPersonId[personId];

おすすめ記事