在C#中设置特定范围的数组值

时间:2016-03-19 07:47:43

标签: c# arrays

我正在寻找一种方法,如何为数组中的特定范围设置特定值。

像这样的东西

伪代码:

var s = new uinit[64];
s[ 0..15] := { 2, 4, 6, 3,  1, 7, 8, 9,  7, 11, 37, 32,  19, 16, 178, 2200 }
s[16..31] := ... 

我试图在C#中找到类似的东西,但没有运气。 我想尝试这样的事情:

public void SetArrayValues(int startIndex, uint[] values) 
{
    var length = values.Length;
    this.array[startIndex, startIndex + length] = values;
}

我唯一能找到的是System.Array.SetValue,但这不符合我的要求。

我错过了什么吗?

感谢您提前提供任何帮助

5 个答案:

答案 0 :(得分:11)

我认为你能做的最接近的是Array.Copy

var s = new uint[64];
uint[] values = { 2, 4, 6, 3, 1, 7, 8, 9, 7, 11, 37, 32, 19, 16, 178, 2200 };

int sourceIndex = 0;
int destinationIndex = 0;
Array.Copy(values, sourceIndex , s, destinationIndex , values.Length);

答案 1 :(得分:3)

你可以写一个扩展方法来简化这个:

public static class ArrayExt
{
    public static T[] Set<T>(this T[] self, int index, params T[] values)
    {
        Array.Copy(values, 0, self, index, values.Length);
        return self;
    }
}

使用它看起来像这样:

var s = new uint[64];
s.Set<uint>(0, 2, 4, 6, 3, 1, 7, 8, 9, 7, 11, 37, 32, 19, 16, 178, 2200);

因为Set()返回数组,你也可以链接这样的调用:

s.Set<uint>( 0, 2, 4, 6, 3, 1, 7, 8, 9, 7, 11, 37, 32, 19, 16, 178, 2200)
 .Set<uint>(16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,  15,   16);

注意:明确将类型置于调用中的要求来自于我们在值列表中使用int的事实。

您应该使用uint,因为目标是uint,因此无需指定类型:

var s = new uint[64];
s.Set(0, 2u, 4u, 6u, 3u, 1u, 7u, 8u, 9u, 7u, 11u, 37u, 32u, 19u, 16u, 178u, 2200u);

当然,它适用于所有类型,例如string

var x = new string[64];
x.Set(10, "A", "B", "C");

答案 2 :(得分:0)

与您描述的方法不完全匹配,但您可以创建List<int>并使用AddRange()方法。添加完所有值后,您可以使用ToArray()方法将其转换为数组。

var numbers = new List<int>();
numbers.AddRange(new List<int>{ 2, 4, 6, 3,  1, 7, 8, 9,  7, 11, 37, 32,  19, 16, 178, 2200 });
//numbers.AddRange(new List<int> { ... });

var asArray = numbers.ToArray();

答案 3 :(得分:0)

首先定义数组

    s1 := { ... }
    s2 := { ... }
    s3 := { ... }
    ...
    sn := { ... }

然后在linq方法链中将它们连接起来

var result = s1.Concat(s2).Concat(s3)....Concat(sn);

您可以按照自己喜欢的顺序执行此操作并获得准确的结果。只需稍微修改链条就可以轻松更改结果序列。

答案 4 :(得分:-1)

你可以通过几种方式完成。因为我不了解您的要求和您的代码,我知道您需要修改它以适合您。但C#数组与C ++数组不同,因此索引总是从零开始。

UInt64[] list = {2, 4, 6, 3, 1, 7, 8, 9, 7, 11, 37, 32, 19, 16, 178, 2200,..}; 
//Length of the list must be 31. That is contain 31 numbers.

UInt64[] s= new UInt64[31];

// You can have all the collection  

for (int i = 0; i < list.Length; i++)
{
    s[i] = list[i];
}    

// Or you can modify as below

for (int i = 0; i < 15; i++)
{
    s[i] = list[i];
}

for (int i = 16; i < 31; i++)
{
    s[i] = list[i];
}