C# 相当于 Scala List 的 Zip with Index?



使用 C#,如何将列表/数组/字典转换/迭代为可以轻松输出索引的集合?

例如,在 Scala 中,我会使用 .zipWithIndex 将 [a,b,c] 的列表转换为 [(a, 0(, (b, 1(, (c, 2(] 的列表。

有没有一种"简单"的方法可以使用内置的.net方法做到这一点?通过 LINQ 还是其他方式?

还是我必须使用外部函数库,或者编写自己的扩展方法?

从他们的文档中:

http://www.scala-lang.org/api/2.12.1/scala/collection/immutable/List.html#zipWithIndex:List[(A,国际(]

例: List("a", "b", "c"(.zipWithIndex = List(("a", 0(, ("b", 1(, ("c", 2((

Enumerable.Select具有索引的覆盖:

(new List<string>{"a","b","c"}).Select((value,index) => new {value, index})

根据您需要的输出,new {value, index}更改为您想要的任何类型。

第一个答案更干净,但我什至不知道使用对象索引的Select过载。 我使用Enumerable.RangeZip方法提出了以下答案。 我正在投射到一个System.ValueTuple.

var myList = new List<object> { "a", "b", "c" };
Enumerable.Range(start: 0, count: myList.Count)
          .Zip(myList, (n, value) => (value, n));

MoreLinq的EquiZip<TFirst, TSecond, TResult>(TFirst, TSecond, Func<TFirst, TSecond, TResult>)可以做到这一点:

var myList = new List<string> { "one", "two", "three" };
var zipped = myList.EquipZip(Enumerable.Range(1, 3), (s, i) => (s, i));

或者你可以使用MoreLinq ForEach方法之一来做到这一点:

var myList = new List<string> { "one", "two", "three" };
myList.ForEach((s, i) => { ... } );

虽然我必须承认早期答案的Select方法是最直接的。

最新更新