C# C语言中数组的子集#
如果我有一个包含12个元素的数组,我想要一个包含第一个和第12个元素的新数组。例如,如果我的数组如下所示:C# C语言中数组的子集#,c#,arrays,C#,Arrays,如果我有一个包含12个元素的数组,我想要一个包含第一个和第12个元素的新数组。例如,如果我的数组如下所示: __ __ __ __ __ __ __ __ __ __ __ __ a b c d e f g h i j k l __ __ __ __ __ __ __ __ __ __ __ __ 我想对其进行转换或创建一个新数组 __ __ __ __ __ __ __ __ __ __ b c d e f g h i j k __ __ __ _
__ __ __ __ __ __ __ __ __ __ __ __
a b c d e f g h i j k l
__ __ __ __ __ __ __ __ __ __ __ __
我想对其进行转换或创建一个新数组
__ __ __ __ __ __ __ __ __ __
b c d e f g h i j k
__ __ __ __ __ __ __ __ __ __
我知道我可以通过迭代来实现。我只是想知道C#中是否有更干净的方法
**更新以修复输入错误。将10个元素更改为12个元素。林克是你的朋友。:)
当然,与手动创建数组并对其进行迭代相比,效率要低一些,但要简单得多
使用的稍微长一点的方法如下
var newArray = new int[oldArray.Count - 2];
Array.Copy(oldArray, 1, newArray, 0, newArray.Length);
您可以使用或LINQ来执行此操作
Array.Copy()可以为您做到这一点,但您仍然需要创建具有正确大小的新阵列。Linq非常漂亮和时髦,但是如果您正在寻找单行程序,您可以将自己的实用程序函数组合在一起:
static class ArrayUtilities
{
// create a subset from a range of indices
public static T[] RangeSubset<T>(this T[] array, int startIndex, int length)
{
T[] subset = new T[length];
Array.Copy(array, startIndex, subset, 0, length);
return subset;
}
// create a subset from a specific list of indices
public static T[] Subset<T>(this T[] array, params int[] indices)
{
T[] subset = new T[indices.Length];
for (int i = 0; i < indices.Length; i++)
{
subset[i] = array[indices[i]];
}
return subset;
}
}
如果要避免对数组进行手动索引。但是,不要尝试将请求拉到任何地方:
var newArray = oldArray.Skip(1).Reverse().Skip(1).Reverse().ToArray()
您可以使用
ArraySegment
结构,如下所示:
var arr = new[] { 1, 2, 3, 4, 5 };
var offset = 1;
var count = 2;
var subset = new ArraySegment<int>(arr, offset, count)
.ToArray(); // output: { 2, 3 }
var arr=new[]{1,2,3,4,5};
var偏移=1;
var计数=2;
var子集=新阵列分段(arr、偏移量、计数)
.ToArray();//输出:{2,3}
在这里查看一个更容易使用的索引。C#8有一个范围
和索引
类型
char[] a = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l' };
Index i1 = 1; // number 1 from beginning
Index i2 = ^1; // number 1 from end
var slice = a[i1..i2]; // { 'b','c','d','e','f','g','h','i','j' }
我真的很喜欢你最初的答案。林克是我的朋友有一段时间了。我只是从来没有用过跳跃和跳跃。谢谢。@L.Moser:没问题-也换回来了。:)是的,我想我每周左右都会发现一种新的有用的LINQ方法。如果你在
拍摄之后做跳过,这不是会更简单吗?比如:oldArray.Take(oldArray.Length-1)。Skip(1)。ToArray()
?两种方法在效率上可能是相等的。不是LINQ的一个好应用。如果你已经在字符数组级别了,那就做对它。@rolls,修复,ta!“j”不是数组中的第十个元素吗?或者你是说第一个和最后一个元素?这看起来并没有删除最后一个元素。
char[] original = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g' };
// array containing 'b' - 'f'
char[] rangeSubset = original.RangeSubset(1, original.Length - 2);
// array containing 'c', 'd', and 'f'
char[] specificSubset = original.Subset(2, 3, 5);
var newArray = oldArray.Skip(1).Reverse().Skip(1).Reverse().ToArray()
var arr = new[] { 1, 2, 3, 4, 5 };
var offset = 1;
var count = 2;
var subset = new ArraySegment<int>(arr, offset, count)
.ToArray(); // output: { 2, 3 }
char[] a = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l' };
Index i1 = 1; // number 1 from beginning
Index i2 = ^1; // number 1 from end
var slice = a[i1..i2]; // { 'b','c','d','e','f','g','h','i','j' }