当我去那里寻求灵感时,我正在借用this question的代码。我有一个对象列表,该对象有一个整数属性,我想foreach列表和循环的整数。
这是一个非常基本的内部foreach但我怀疑我可以使用SelectMany但不能让它工作。以下代码有效,但我想要一个linq版本。
//set up some data for our example
var tuple1 = new { Name = "Tuple1", Count = 2 };
var tuple2 = new { Name = "Tuple2", Count = 3 };
//put the tuples into a collection
var tuples = new [] { tuple1, tuple2 };
foreach(var item in tuples)
{
for(int i = 0; i < item.Count; i++)
Console.WriteLine(item.Name);
}
答案 0 :(得分:3)
您可以使用SelectMany
;你只需要生成序列:
tuples.SelectMany(t => Enumerable.Repeat(t.Name, t.Count))
答案 1 :(得分:3)
var flattened = tuples.SelectMany(t => Enumerable.Repeat(t.Name, t.Count));
foreach(var word in flattened)
{
Console.WriteLine(word);
}
答案 2 :(得分:1)
您的匿名类型中没有Values
属性。但我认为你的意思是Count
属性,而你想重复这个号码的名称。您可以使用Enumerable.Range
或Enumerable.Repeat
:
IEnumerable<String> tupleNames = tuples
.Select(t => string.Join(Environment.NewLine, Enumerable.Repeat(t.Name, t.Count)));
Console.Write(string.Join(Environment.NewLine, tupleNames));
输出:
Tuple1
Tuple1
Tuple2
Tuple2
Tuple2
答案 3 :(得分:0)
没有foreach
的linq等价物。您应该使用实际foreach
来迭代IEnumerable
并对每个项目执行操作。