在C#中填充数组

26

Java中的Arrays类提供了约18个静态的"fill"方法,用于给数组中的每个元素分配一个值。我正在寻找C#中实现同样功能的等效方法,但我没有找到与它同样简洁的方法:

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

2)Enumerable类的Repeat方法创建一个新数组,从原数组复制每个元素似乎有点开销

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);
}

2
发布一个Java示例,也许我就能理解你想要什么了。 - bas
不知道Java的18种方法。请提供一个例子。 - syed mohsin
为什么要把简单的事情复杂化,如果没有必要的话就不要这样做。 - Greg Oks
这可以帮助您[https://dev59.com/BGYq5IYBdhLWcg3wxTaq?rq=1] - Habib Zare
6个回答

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

我相信这样就行了 :)


4
我知道这种方法,就像我在最初发布的帖子中提到的那样,我正在寻找修改现有数组的方法。 - Mishax

21

编写自己的扩展方法

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


13
你可以尝试这样做: 我已经初始化了数组,将其值设置为5,你也可以类似地放入你的数字。
int[] arr = new int[10]; // your initial array

arr = arr.Select(i => 5).ToArray(); // array initialized to 5.

2
它会创建一个新的数组,而不是填充现有的数组。 - astrowalker

5

假设你想用数字13填充数组。

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

或者

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

如果你更喜欢使用列表。


这难道不会创建一个新数组吗?在Java中,Arrays.fill()并不会创建一个新的数组,而是修改现有的数组。 - Mishax
由于问题是关于使用常量值填充数组(即仅用于初始化),我假设您正在创建该数组。因此,我试图提供一个简短的答案。如果您的数组已经存在,则可以使用Igoy答案中的Select方法。 - roadrunner66
我喜欢这个答案,因为它给了我选择常数注入的索引范围的机会。+1! - Gergely Lukacsy
1
在使用EF时,我喜欢列表的想法,因为它易于使用,并且已经在许多其他实体和对象中普遍使用。+1 - ransems

4

您可以编写一个扩展方法

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

1
复制粘贴以前的答案不太酷;-) - bradgonesurfing
1
我没有复制粘贴任何人的答案。 - WannaCSharp

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;
}

适用于所有>的东西。

1
IList<T> 仍然是 T[] - nawfal
如果有这样一个通用函数 - 我会使用默认参数... public static void Fill<T>(this IList<T> col, T value, int fromIndex=0, int toIndex=-1) { 如果toIndex等于-1 toIndex = col.Count-1; - ephraim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接