2011-03-10 85 views
0
var outline = Grandparents.Select(
    x => 
    x.Parents.Select(
     y => 
     y.Children.Aggregate(string.Empty, (current, child) => string.Format("{0}{1},{2},{3},{4}\n", 
      current, x.Grandparent, 
      y.Parent, 
      child.Name, 
      child.Age)))); 

祖父母是具有兩個成員的類:LINQ的聚合,以生成字符串嵌套類

string Grandparent 
List<Parent> Parents 

父母是具有兩個成員的類:

string Parent 
List<Child> Children 

兒童是具有兩個一類成員:

string Name 
int Age 

我想用Linq以產生我將在文本文件寫入,例如字符串:

Grandpa Walter, Parent William, Child Chris, Age 11 
Grandpa Walter, Parent Sue, Child Alice, Age 7 
Grandpa Walter, Parent Sue, Child Sam, Age 7 
Grandpa Eugene, Parent David, Child Joe, Age 17 

以上代碼生成字符串的IEnumerable的IEnumearable。我想產生只是一個「串」

+0

你能顯示應該pro導致這個輸出? – 2011-03-10 20:40:17

回答

0

上面的查詢會返回一個IEnumerable<IEnumerable<string>>,其中每個元素代表祖父母,和每個每個元素中的字符串代表你對每個家長聚集。

雖然您可以將其轉換爲第二個聚合,但這似乎是使用LINQ來使用LINQ。如果使用StringBuilder並且只是迭代你的集合,你會好得多。您將生成僅比LINQ查詢稍長的代碼,並且可以更容易地查看實際發生的情況。

由於您的查詢沒有定義它,我不確定你想如何組合來自每個家長的結果。如果你可以澄清,我會更新這個答案,以反映這一點。

+0

不,這個查詢返回一個'IEnumerable >'(兩個嵌套Select) – 2011-03-10 20:37:45

+0

@Thomas:良好的捕獲;我已經更新了這個答案。 – 2011-03-10 20:53:32

3

只是用SelectMany()扁平化的順序和使用string.Join()彙總:

string result = string.Join(Environment.NewLine, outline.SelectMany(x=>x)); 
0

試試這個:

string result = (from grandParent in grandParents 
       from parent in grandParent.Parents 
       from child in parent.Children 
       select string.Format("{0}, {1}, {2}, {3}", grandParent.Name, parent.Name, child.Name, child.Age)) 
       .Aggregate((a, b) => a + Environment.NewLine + b); 

總之,而是採用總,我建議你保存使用File.WriteAllLines文本文件:

var results = from grandParent in grandParents 
       from parent in grandParent.Parents 
       from child in parent.Children 
       select string.Format("{0}, {1}, {2}, {3}", grandParent.Name, parent.Name, child.Name, child.Age) 

File.WriteAllLines("myfile.txt", results);