C#等价的Scala List的Zip和Index?

时间:2018-04-06 03:52:29

标签: c# scala

使用C#,如何将List / Array / Dictionary转换/迭代到一个可以轻松输出索引的集合?

E.g。在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,Int)]

  

实施例:   列表(“a”,“b”,“c”)。zipWithIndex = List((“a”,0),(“b”,1),(“c”,2))

3 个答案:

答案 0 :(得分:5)

Enumerable.Select具有索引:

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

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

答案 1 :(得分:2)

第一个答案更清晰,但我甚至不知道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));

答案 2 :(得分:1)

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方法是最直接的。