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。我想生产一个“字符串”
答案 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);