相当于foreach中的for

本文关键字:for 中的 foreach 相当于 | 更新日期: 2023-09-27 18:15:00

我从这个问题中借用代码,因为我去那里寻找灵感。我有一个对象列表,对象有一个整数属性我想对列表进行遍历并循环整数的个数。

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

相当于foreach中的for

var flattened = tuples.SelectMany(t => Enumerable.Repeat(t.Name, t.Count));
foreach(var word in flattened)
{
    Console.WriteLine(word);
}

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

tuples.SelectMany(t => Enumerable.Repeat(t.Name, t.Count))

匿名类型中没有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

没有与foreach等效的linq。您应该使用实际的foreach来迭代IEnumerable,并对每个项执行操作。