在不使用for循环的情况下将相同的值设置为数组/列表

时间:2014-06-27 09:48:32

标签: c# arrays

我想在不使用循环的情况下为数组或列表的特定范围设置相同的值。它看起来如下:

int[] myArray = new int[100]; 
int lower = 20; 
int upper = 80; 
int value = 5;

myArray.Method(lower,upper,value);

我尝试了myArray.SetValue()myList.InsertRange(),但它只允许设置一个值,而不是范围。

是否有任何C#-Method正在执行该任务? 可以没有循环吗?

2 个答案:

答案 0 :(得分:2)

好吧,您可以创建一个正确大小的临时数组并将其复制到源数组

Array.Copy(Enumerable.Repeat(value, upper-lower+1).ToArray(), 0,
           myArray, lower, upper-lower+1);

但效率很低(而且,在内部,Enumerable.Repeat也使用了循环)

我不知道简单的for循环有什么问题:

for(int i = lower; i <= upper; i++)
    myArray[i] = value;

答案 1 :(得分:1)

您需要在某处使用循环,因为您最常使用的硬件不支持此类操作。

这是一个通用的扩展方法,可以根据您的规范对所有数组类型起作用:

class Program
{
    static void Main(string[] args)
    {
        int[] ints = new int[5];
        ints.UpdateRange(2, 4, 5);
        //ints has value [0,0,5,5,0]
    }
}

public static class ArrayExtensions
{
    public static void UpdateRange<T>(this T[] array, int lowerBound, int exclusiveUpperBound, T value)
    {
        Contract.Requires(lowerBound >= 0, "lowerBound must be a positive number");
        Contract.Requires(exclusiveUpperBound > lowerBound, "exclusiveUpperBound must be greater than lower bound");
        Contract.Requires(exclusiveUpperBound <= array.Length, "exclusiveUpperBound must be less than or equal to the size of the array");

        for (int i = lowerBound; i < exclusiveUpperBound; i++) array[i] = value;
    }
}