使用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))
答案 0 :(得分:5)
Enumerable.Select
具有索引:
(new List<string>{"a","b","c"}).Select((value,index) => new {value, index})
根据您需要将输出new {value, index}
更改为您想要的任何类型。
答案 1 :(得分:2)
第一个答案更清晰,但我甚至不知道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));
答案 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
方法是最直接的。