使用 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.Range
和Zip
方法提出了以下答案。 我正在投射到一个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
方法是最直接的。