【问题标题】:C# equivalent of Scala List's Zip with Index?C# 相当于 Scala List 的 Zip with Index?
【发布时间】:2018-04-06 03:52:28
【问题描述】:

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

例如在 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)]

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

【问题讨论】:

    标签: c# scala


    【解决方案1】:

    Enumerable.Select 具有具有索引的覆盖:

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

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

    【讨论】:

      【解决方案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));
      

      【讨论】:

        【解决方案3】:

        MoreLinq 的 EquiZip&lt;TFirst, TSecond, TResult&gt;(TFirst, TSecond, Func&lt;TFirst, TSecond, TResult&gt;) 可以做到这一点:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-08
          • 2020-09-07
          • 2019-12-05
          • 1970-01-01
          • 1970-01-01
          • 2018-04-14
          • 2011-09-17
          • 1970-01-01
          相关资源
          最近更新 更多