Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中数组的子集#_C#_Arrays - Fatal编程技术网

C# C语言中数组的子集#

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 __ __ __ _

如果我有一个包含12个元素的数组,我想要一个包含第一个和第12个元素的新数组。例如,如果我的数组如下所示:

__ __ __ __ __ __ __ __ __ __ __ __
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' }