9

C# 配列のサブセットをメソッドに渡したいと思います。メソッドがデータを上書きするかどうかは気にしないので、コピーの作成を避けたいと思います。

これを行う方法はありますか?

ありがとう。

4

5 に答える 5

17

IEnumerable<T>またはを取るようにメソッドを変更しArraySegment<T>ます。

その後、合格できますnew ArraySegment<T>(array, 5, 2)

于 2013-01-14T18:03:33.407 に答える
4

次のクラスを使用できます。endIndex包括的か排他的かによって、変更が必要になる場合があることに注意してください。開始インデックスと終了インデックスではなく、開始インデックスとカウントを取るように変更することもできます。

意図的に変更可能なメソッドを追加しませんでした。特にそれらが必要な場合は、簡単に追加できます。IList変更可能なメソッドを追加する場合は、実装することもできます。

public class Subset<T> : IReadOnlyList<T>
{
    private IList<T> source;
    private int startIndex;
    private int endIndex;
    public Subset(IList<T> source, int startIndex, int endIndex)
    {
        this.source = source;
        this.startIndex = startIndex;
        this.endIndex = endIndex;
    }

    public T this[int i]
    {
        get
        {
            if (startIndex + i >= endIndex)
                throw new IndexOutOfRangeException();
            return source[startIndex + i];
        }
    }

    public int Count
    {
        get { return endIndex - startIndex; }
    }

    public IEnumerator<T> GetEnumerator()
    {
        return source.Skip(startIndex)
            .Take(endIndex - startIndex)
            .GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
于 2013-01-14T18:18:50.740 に答える
3

配列はサイズによって不変です (つまり、配列のサイズを変更することはできません)。したがって、元の配列の減算されたコピーのみを渡すことができます。オプションとして、元の配列とは別に 2 つのインデックスをメソッドに渡し、追加の 2 つのインデックスに基づいて操作できます。

于 2013-01-14T18:03:01.927 に答える
-4

Linq take funktion を使用して、配列から必要な数の要素を取得できます

var yournewarray = youroldarray.Take(4).ToArray();
于 2013-01-14T18:05:59.807 に答える