在LINQ分组,有2个属性

Ati*_*qar 1 c# linq group-by

这是一个已经被问到的问题,但问题是仅使用2个属性,我需要使用3个属性,所以我复制粘贴大部分文本.

我们假设我们有一个类似的课程

class Person { 
internal int PersonID; 
internal string car  ;
internal string friend  ;
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个这个类的列表:列出人员;

现在,此列表可以具有多个相同PersonID的实例,例如.

persons[0] = new Person { PersonID = 1, car = "Ferrari" , friend = "Josh" }; 
persons[1] = new Person { PersonID = 1, car = "BMW" , friend = "Olof"     }; 
persons[2] = new Person { PersonID = 2, car = "Audi"  , friend = "Gustaf"   }; 
Run Code Online (Sandbox Code Playgroud)

有没有办法我可以按人员ID分组并获得他拥有的所有汽车和朋友的列表?对于前者 预期的结果将是

class Result { 
   int PersonID;
   List<string> cars; 
   List<string> friends; 
}
Run Code Online (Sandbox Code Playgroud)

从我到目前为止所做的:

IEnumerable resultsForDisplay = ResultFromSQL_Query.GroupBy(
    p => p.PersonId.ToString(),
    p => p.car,
    (key,  g) => new { PersonId = key, car = g.ToList()});
Run Code Online (Sandbox Code Playgroud)

但是现在我坚持让friend's阵列进入resultsForDisplay

Wil*_*sem 5

当然,您也可以在组上执行LINQ查询g,例如:

IEnumerable<Result> resultsForDisplay = from q in ResultFromSQL_Query
    group q by q.PersonID into g
    select new Result {PersonID = g.Key,cars = g.Select(x => x.car).ToList(), friends = g.Select(x => x.friend).ToList()};
Run Code Online (Sandbox Code Playgroud)

或者使用lambda表达式:

IEnumerable<Result> results = persons.GroupBy(x => x.PersonID)
    .Select(g => new Result { PersonID = g.Key, cars = g.Select(x => x.car).ToList(), friends = g.Select(x => x.friend).ToList()};
Run Code Online (Sandbox Code Playgroud)

因此,您可以对组执行任何LINQ查询(因此表现IEnumerable<>为该组的元素),例如a .Select(..),但是.Sum(..),.Average(..)以及其他子查询,聚合等.