2016-08-17 39 views
2

我想使用流利(即「方法」)語法編寫嵌套GroupBy LINQ表達式。嵌套GroupBy LINQ使用流利的語法

這裏是我的類和數據:

class Person 
{ 
    public String ZipCode, Gender, Name; 
} 

private static List<Person> people = new List<Person> 
{ 
    new Person { ZipCode= "11111", Gender = "M", Name = "Tom" }, 
    new Person { ZipCode= "11111", Gender = "M", Name = "Bob" }, 
    new Person { ZipCode= "11111", Gender = "F", Name = "Nancy" }, 
    new Person { ZipCode= "11111", Gender = "F", Name = "Lisa" }, 
    new Person { ZipCode= "22222", Gender = "M", Name = "Dan" }, 
    new Person { ZipCode= "33333", Gender = "F", Name = "Mary" }, 
    new Person { ZipCode= "44444", Gender = "F", Name = "Joan" }, 
    new Person { ZipCode= "44444", Gender = "F", Name = "Jane" }, 
    new Person { ZipCode= "44444", Gender = "M", Name = "Bill" } 
}; 

什麼,我想實現的是由ZipCodeZipCode分組,然後由Gender的對象。在對象類型方面,我要尋找這樣的:

IEnumerable<IGrouping<string, IEnumerable<IGrouping<string, Person>>>> 

這將然後讓我訪問查詢結果是這樣的:

foreach(var byZip in mainQuery) { 
    Console.WriteLine(byZip.Key); // print the ZipCode 
    foreach(var byGender in byZip) { 
     Console.WriteLine(byGender.Key) // print the Gender 
     foreach (Person p in byGender) 
     Console.WriteLine(p.Name); 
    } 
} 

同樣,我期待用流利的符號。


基於以下傑夫的答案,這是查詢和訪問:

IEnumerable<IGrouping<string, IEnumerable<IGrouping<string, Person>>>> query = 
    people 
     .GroupBy(p => p.ZipCode) 
      .GroupBy(
       keySelector: g => g.Key, 
       elementSelector: g => g.GroupBy(p => p.Gender) 
      ); 


foreach (IGrouping<string, IEnumerable<IGrouping<string, Person>>> byZip in query) 
{ 
    Console.WriteLine(byZip.Key); // print the ZipCode 
    foreach (IEnumerable<IGrouping<string, Person>> byGender in byZip) 
    { 
     foreach (IGrouping<string, Person> t in byGender) 
     { 
      Console.WriteLine(t.Key); // print the Gender 
      foreach (Person y in t) 
       Console.WriteLine(y.Name); 
     } 

    } 
} 

回答

6

在查詢語法,你可以寫這樣的:

var query = 
    from p in people 
    group p by p.ZipCode into g 
    let gender = 
     from p in g 
     group p by p.Gender 
    group gender by g.Key; 

並使用「流利」的語法轉換它,這將成爲本:

var query2 = people.GroupBy(p => p.ZipCode) 
    .GroupBy(
     g => g.Key, 
     g => g.GroupBy(p => p.Gender) 
    ); 

不過你想要的方式來訪問權限與實際類型不符。你的訪問模式,使您的類型實際上是:

IEnumerable<IGrouping<string, IGrouping<string, Person>>> 

所以查詢應該是:

var query = 
    from p in people 
    group p by p.ZipCode into g 
    let gender = 
     from p in g 
     group p by p.Gender 
    from g2 in gender 
    group g2 by g.Key; 

和轉換......是有點複雜。

var query2 = people.GroupBy(p => p.ZipCode) 
    .SelectMany(g => 
     g.GroupBy(p => p.Gender).GroupBy(g2 => g.Key) 
    ); 
+0

超級計數器直觀(我總是忘記做什麼模式後),但工程。酷:) –

0

以下:

var peopleGroupedByZipCode = people 
    .GroupBy(p => p.ZipCode) 
    .Select(group => new 
    { 
     ZipCode = group.Key, 
     PeopleGroupedByGender = group.GroupBy(p => p.Gender) 
    }); 

foreach (var resultsByZipCode in peopleGroupedByZipCode) 
{ 
    Console.WriteLine("ZipCode: " + resultsByZipCode.ZipCode); 
    foreach (var resultsByGender in resultsByZipCode.PeopleGroupedByGender) 
    { 
     Console.WriteLine(" Gender : " + resultsByGender.Key); 
     foreach (var resultWithinGenderGroup in resultsByGender) 
      Console.WriteLine(" " + resultWithinGenderGroup.Name); 

    } 
} 

會寫了以下工作:

郵政編碼:11111

性別:M

湯姆

鮑勃

性別:F

南希

麗莎

郵編:22222

性別:

郵編:33333

性別:F

瑪麗

郵編:44444

性別:F

性別:M

比爾

那是諸如此類的事情,你想要什麼?

(我意識到,這不正是一個IEnumerable < IGrouping <串,IEnumerable的< IGrouping <串,人> > > >但我想,這是你感興趣的是精確型數據的更多形狀)。

+0

這樣的工作,但我是堅持得到我提到的所需類型。我不明白這一點令人惱火。 –