23

在 Java 中,Arrays 类中有大约 18 个静态“填充”方法,它们用于为数组中的每个元素分配一个值。我正在寻找 C# 中的等价物来实现相同的目标,但我没有找到任何具有相同紧凑性的东西:

1)据我所知,ForEach 按值传递数组中的元素,因此我无法更改它们

2)从 Enumerable 重复创建一个新数组,创建一个新数组然后从数组中复制每个元素似乎是开销

3) for 循环并不漂亮,我想这就是为什么 Java 人一开始就引入了这种紧凑的符号

4) Array 类中的 Clear 方法可以将所有内容设置为零,但是如何将零转换为我想要的非零值?

为了演示 Java 的语法,请考虑打印三倍于数字 7 的这段代码:

int[] iii = {1, 2, 3};
Arrays.fill(iii, 7);
for (int i : iii) {
    System.out.println(i);
}
4

6 回答 6

61
int[] arr = Enumerable.Repeat(42, 10000).ToArray();

我相信这可以完成工作:)

于 2013-02-17T09:28:42.057 回答
19

给自己写一个扩展方法

public static class ArrayExtensions {
    public static void Fill<T>(this T[] originalArray, T with) {
        for(int i = 0; i < originalArray.Length; i++){
            originalArray[i] = with;
        }
    }  
}

并像使用它一样

int foo[] = new int[]{0,0,0,0,0};
foo.Fill(13);

将用 13 填充所有元素

于 2013-02-17T08:33:31.593 回答
13

你可以尝试这样的事情:

我已经将数组初始化为值为 5,您可以类似地输入您的数字。

int[] arr = new int[10]; // your initial array

arr = arr.Select(i => 5).ToArray(); // array initialized to 5.
于 2013-02-17T08:31:26.030 回答
5

假设您要填写数字 13。

int[] myarr = Enumerable.Range(0, 10).Select(n => 13).ToArray();

或者

List<int> myarr = Enumerable.Range(0,10).Select(n => 13).ToList();

如果您更喜欢列表。

于 2013-02-17T08:45:34.710 回答
4

你可以写一个扩展方法

public static void Fill<T>(this T[] array, T value)
{
  for(int i = 0; i < array.Length; i++) 
  {
     array[i] = value;
  }
}
于 2013-02-17T08:39:17.920 回答
3
public static void Fill<T>(this IList<T> col, T value, int fromIndex, int toIndex)
{
    if (fromIndex > toIndex)
        throw new ArgumentOutOfRangeException("fromIndex");

    for (var i = fromIndex; i <= toIndex; i++)
        col[i] = value;
}

适用于所有IList<T>s 的东西。

于 2013-02-17T08:42:14.793 回答