我正在寻找一种方法,如何为数组中的特定范围设置特定值。
像这样的东西
伪代码:
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,但这不符合我的要求。
我错过了什么吗?
感谢您提前提供任何帮助
答案 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];
}