【问题标题】:Replacement for for... if array iteration替换 for... if 数组迭代
【发布时间】:2010-09-06 00:25:27
【问题描述】:

我喜欢 Python 中的列表推导式,因为它们简洁地表示了列表的转换。

但是,在其他语言中,我经常发现自己写的内容大致如下:

foreach (int x in intArray)
  if (x > 3) //generic condition on x
    x++ 
    //do other processing

这个例子是用 C# 编写的,我的印象是 LINQ 可以帮助解决这个问题,但是有没有一些通用的编程结构可以替代这个稍微不够优雅的解决方案?也许是我没有考虑的数据结构?

【问题讨论】:

    标签: .net python arrays loops iteration


    【解决方案1】:

    原始foreach 循环中的增量不会影响数组的内容,唯一的方法仍然是for 循环:

    for(int i = 0; i < intArray.Length; ++i)
    {
        if(intArray[i] > 3) ++intArray[i];
    }
    

    Linq 不打算修改现有的集合或序列。它基于现有序列创建新序列。使用 Linq 实现上述代码是可能的,尽管它有点违背它的目的:

    var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
    var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));
    

    如其他一些答案所示,使用where(或等效项)将从结果序列中排除任何小于或等于 3 的值。

    var intArray = new int[] { 10, 1, 20, 2 };
    var newArray = from i in intArray where i > 3 select i + 1;
    // newArray == { 11, 21 }
    

    数组上有一个 ForEach 方法,它允许您使用 lambda 函数而不是 foreach 块,但除了方法调用之外,我会坚持使用 foreach

    intArray.ForEach(i => DoSomething(i));
    

    【讨论】:

      【解决方案2】:

      在 C# 中,您可以对 IEnumerable 中的任何内容应用选择性处理,如下所示:

      intArray.Where(i => i > 3).ConvertAll();
      DoStuff(intArray.Where(i => i 3));
      

      等等。

      【讨论】:

        【解决方案3】:

        在 Python 中,您有 filter and map,它可以满足您的需求:

        map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray))
        

        还有list comprehensions 可以在一个简单的语句中做到这两点:

        [f(x + 1) for x in intArray if x > 3]
        

        【讨论】:

          【解决方案4】:

          在 Ruby 中:

          intArray.select { |x| x > 3 }.each do |x|
            # do other processing
          end
          

          或者如果“其他处理”是一个简短的单行:

          intArray.select { |x| x > 3 }.each { |x| something_that_uses x }
          

          最后,如果要返回一个新数组,其中包含对大于 3 的元素的处理结果:

          intArray.select { |x| x > 3 }.map { |x| do_something_to x }
          

          【讨论】:

            【解决方案5】:
            map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))
            

            【讨论】:

              【解决方案6】:

              取决于语言和您需要做什么,许多语言中称为“地图”的“地图”可能就是您要寻找的。我不懂C#,但根据this page,.NET 2.0 调用 map "ConvertAll"。

              “map”的含义很简单——获取一个列表,然后对其中的每个元素应用一个函数,然后返回一个新列表。您可能还在寻找“过滤器”,它会为您提供满足另一个列表中谓词的项目列表。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-10-02
                • 2016-06-13
                • 1970-01-01
                • 2013-01-04
                • 1970-01-01
                • 1970-01-01
                • 2022-11-23
                • 2023-03-16
                相关资源
                最近更新 更多