代码之家  ›  专栏  ›  技术社区  ›  Overly Excessive

使用Array.ForEach更改ref元素值?

  •  0
  • Overly Excessive  · 技术社区  · 12 年前

    我正在尝试使用 Array.ForEach() 扩展方法循环遍历数组中的过滤元素列表,然后修改这些值,不幸的是,我猜这似乎不起作用,因为它实际上并没有修改每个元素的引用值。

    除了存储 Array.ForEach() 然后将该阵列克隆到原始阵列?而且我知道如果我使用一个 for 但如果我能这样做,它会更干净,代码也会更少。

    下面是片段:

    Array.ForEach(Array.FindAll(starts, e => e < 0), e => e = 0);
    
    3 回复  |  直到 12 年前
        1
  •  2
  •   Magnus    12 年前

    ForEach 根本不打算这样做-就像你不能用 foreach

    就我个人而言,我只需要 for 循环-易于阅读和清晰:

    for (int i = 0; i < array.Length; i++)
    {
        // Alternatively, use Math.Max to pull up any negative values to 0
        if (array[i] < 0)
        {
            array[i] = 0;
        }
    }
    

    这真的很简单- 任何人 将能够理解它。

    现在你 能够 改为编写自己的扩展方法。你可以写一个来用一个固定值替换所有满足谓词的值,或者写一个完全替换所有值。。。但我不认为这真的值得。作为后者的一个例子:

    public static void ReplaceElements<T>(this T[] array,
                                          Func<T, T> replacementFunction)
    {
        // TODO: Argument validation
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = replacementFunction(array[i]);
        }
    }
    

    然后调用它:

    starts.ReplaceElements(x => Math.Max(x, 0));
    

    我个人还是会使用 对于 尽管如此。

    (你可以稍微改变一下上面的内容 IList<T> 和使用 Count 相反这仍然适用于阵列,但 List<T> 等等。)

        2
  •  0
  •   Bolpat    7 年前

    你可以用 ref 以及代表。然而,我认为这并没有增加多少价值。

    public delegate void RefAction<T>(ref T value);
    public static void ForEachRef<T>(this T[] array, RefAction<T> action)
    {
        for (int i = 0; i < array.Length; ++i) action(ref array[i]);
    }
    

    您可以按如下方式使用它:

    var myArray = new int[];
    myArray.ForEachRef((ref int i) => i = whateverYouLike());
    

    从可能性的角度来看,可能有一个接口 IRefEnumerable<T> 它用可分配的元素迭代一些容器。

        3
  •  -1
  •   Selman Genç    12 年前
    array = array.Select(x => (x < 0) ? 0: x).ToArray();