C#中数组的子集

LJM*_*LJM 40 c# arrays

如果我有一个包含12个元素的数组,我想要一个新的数组,它会丢弃第一个和第12个元素.例如,如果我的数组看起来像这样:

__ __ __ __ __ __ __ __ __ __ __ __
a  b  c  d  e  f  g  h  i  j  k  l
__ __ __ __ __ __ __ __ __ __ __ __
Run Code Online (Sandbox Code Playgroud)

我想要转换它或创建一个看起来像的新数组

__ __ __ __ __ __ __ __ __ __

b  c  d  e  f  g  h  i  j  k 
__ __ __ __ __ __ __ __ __ __
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过迭代它们来做到这一点.我只是想知道C#中是否有更简洁的方法.

**更新修复一个TYPO.将10个元素更改为12个元素.

Nol*_*rin 76

LINQ是你的朋友.:)

var newArray = oldArray.Skip(1).Take(oldArray.Length - 2).ToArray();
Run Code Online (Sandbox Code Playgroud)

比手动创建数组并迭代它当然有点效率低,但很简单......

使用的稍微冗长的方法Array.Copy如下.

var newArray = new int[oldArray.Count - 2];
Array.Copy(oldArray, 1, newArray, 0, newArray.Length);
Run Code Online (Sandbox Code Playgroud)

  • 虽然Linq很方便,但性能却要低得多 (4认同)
  • LINQ的应用不是很好.如果你已经在char数组级别,那么就做对了. (3认同)

Dr.*_*ice 37

Linq很漂亮,时髦,但是如果你正在寻找1-liner,你可以把你自己的实用功能放在一起:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么你可以做以下事情:

        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);
Run Code Online (Sandbox Code Playgroud)

  • 我非常喜欢这个解决方案. (4认同)

Pra*_*uis 7

C# 8 有一个RangeandIndex类型

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' }
Run Code Online (Sandbox Code Playgroud)


Bob*_*Bob 5

您可以使用Array.Copy或LINQ 执行此操作.

var letters = string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i" };

int length = letters.Length - 2;
var items = new string[length];
Array.Copy(letters, 1, items, 0, length);
// or
var items = letters.Skip(1).Take(length).ToArray();
Run Code Online (Sandbox Code Playgroud)


ora*_*rad 5

您可以使用ArraySegment<T>如下结构:

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 }
Run Code Online (Sandbox Code Playgroud)

在此处查看扩展方法,以使其更容易使用。