【问题标题】:fill an array in C# [duplicate]在C#中填充一个数组[重复]
【发布时间】:2013-02-01 21:01:41
【问题描述】:

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

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

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

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

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

为了演示 Java 的语法,请考虑以下打印 3 倍数字 7 的代码:

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

【问题讨论】:

  • 发布一个Java示例,也许我明白你想要什么
  • 不知道java的18种方法。发布一个例子。
  • 在不需要复杂化的情况下为什么要复杂化..

标签: c# arrays


【解决方案1】:

你可以试试这样的:

我已将数组初始化为值为 5,您可以同样输入您的数字。

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

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

【讨论】:

  • 创建新数组,而不是填充现有数组。
【解决方案2】:

给自己写一个扩展方法

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 填充所有元素

【讨论】:

    【解决方案3】:

    你可以写一个扩展方法

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

    【讨论】:

    • 复制粘贴以前的答案不是很酷;-)
    • 我没有复制粘贴任何人的答案。
    【解决方案4】:
    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&lt;T&gt;s 的东西。

    【讨论】:

    • IList&lt;T&gt; 仍然是T[]
    • 如果这样的通用函数 - 我会使用默认 prms... public static void Fill(this IList col, T value, int fromIndex=0, int toIndex=- 1) { if (toIndex == -1) toIndex = col.Count-1;
    【解决方案5】:

    假设你要填写数字 13。

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

    List&lt;int&gt; myarr = Enumerable.Range(0,10).Select(n =&gt; 13).ToList();

    如果您喜欢列表。

    【讨论】:

    • 这不是在创建一个新数组吗? Arrays.fill() 在 Java 中没有这样做,它正在修改现有的。
    • 由于问题是关于用常量值填充数组(即仅用于初始化),我假设您当时正在创建数组。所以我试图提供一个简短的答案。如果您的数组之前已经存在,我会在 Igoy 的回答中使用 Select 方法。
    • 我喜欢这个答案,因为它让我有机会选择将注入常量的索引范围。 +1!
    • 在使用 EF 时,我喜欢列表的想法,因为它很容易使用并且已经被许多其他实体和对象普遍使用。在这里 +1
    【解决方案6】:
    int[] arr = Enumerable.Repeat(42, 10000).ToArray();
    

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

    【讨论】:

    • 我知道这种方法,正如我在 OP 中提到的那样,我正在寻找修改现有数组的东西。
    猜你喜欢
    • 2018-05-07
    • 2014-12-23
    • 2014-12-31
    • 2020-01-12
    • 2017-08-30
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多