2011-03-10 39 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);