我想在不使用循环的情况下为数组或列表的特定范围设置相同的值。它看起来如下:
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正在执行该任务? 可以没有循环吗?
答案 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;
}
}