Linq Aggregate生成带有嵌套类的字符串

时间:2011-03-10 20:29:51

标签: c# linq

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))));

祖父母是一个有两个成员的班级:

string Grandparent
List<Parent> Parents

父母是一个有两个成员的班级:

string Parent
List<Child> Children

Child是一个有两个成员的班级:

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的IEnumerable。我想生产一个“字符串”

3 个答案:

答案 0 :(得分:3)

使用SelectMany()展开序列并使用string.Join()汇总:

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

答案 1 :(得分:0)

上述查询将返回IEnumerable<IEnumerable<string>>,其中每个元素代表一个祖父母,每个元素中的每个字符串代表每个父元素的聚合。

虽然您可以将其转换为第二个聚合,但这似乎是为了使用LINQ而使用LINQ。使用StringBuilder并迭代您的集合会更好。您将生成仅比LINQ查询稍长的代码,并且更容易看到实际发生的情况。

由于您的查询没有定义它,我不确定您希望如何组合每个父级的结果。如果您能澄清一下,我会更新此答案以反映这一点。

答案 2 :(得分: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保存文本文件,而不是使用Aggregate:

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);