0

当我去那里寻求灵感时,我正在从这个问题中借用代码。我有一个对象列表,该对象有一个整数属性,我想遍历列表并循环整数的数量。

这是一个非常基本的 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);
}
4

4 回答 4

3

您可以使用SelectMany; 您只需要生成序列:

tuples.SelectMany(t => Enumerable.Repeat(t.Name, t.Count))
于 2013-05-23T20:08:04.890 回答
3
var flattened = tuples.SelectMany(t => Enumerable.Repeat(t.Name, t.Count));

foreach(var word in flattened)
{
    Console.WriteLine(word);
}
于 2013-05-23T20:08:36.533 回答
1

您的匿名类型中没有Values属性。但我假设您指的是Count财产,而您想重复这个数字的名称。您可以使用Enumerable.RangeEnumerable.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
于 2013-05-23T20:10:03.683 回答
0

没有 linq 等价于 a foreach。您应该使用实际foreach来迭代IEnumerable和对每个项目执行操作。

于 2013-05-23T20:07:20.510 回答