C# での配列スライシング

  1. C# の Linq メソッドを使用した配列スライシング
  2. C# の ArraySegment クラスを使用した配列スライシング
  3. C# の拡張関数を使用した配列スライシング

このチュートリアルでは、C# で配列をスライスする方法を紹介します。

[手を動かしながら学ぶIP...
[手を動かしながら学ぶIPネットワーク] #3 レイヤ3スイッチ

C# の Linq メソッドを使用した配列スライシング

アレイをより小さなサブアレイにスライスするプロセスは、アレイスライスと呼ばれます。Linq は、クエリ機能を C# のデータ構造と統合するために使用されます。Linq の Take(x) 関数は、データ構造の先頭から x 個の要素をコピーします。次のコード例は、C# で Linq を使用して配列をスライスする方法を示しています。

using System;
using System.Linq;

namespace array_slicing
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] foo = {"one", "two", "three", "four", "five" };

            string[] bar = foo.Take(2).ToArray();
            foreach(var e in bar)
            {
                Console.WriteLine(e);
            }
        }
    }
}

出力:

one
two

文字列の配列 foo を初期化し、それを別の文字列の配列である bar にスライスしました。これには、foo 配列の最初の 2つの要素が含まれています。このメソッドでは配列の開始要素しかスライスできないため、このメソッドは非常に制限されています。

C# の ArraySegment クラスを使用した配列スライシング

ArraySegment クラスは、配列を C# のサブ配列にスライスするために使用されます。ArraySegment クラスのコンストラクターは、セグメント化される配列、開始インデックス、およびセグメント化される要素の数を受け取り、サブ配列を提供します。次のコード例は、C# で ArraySegment クラスを使用して配列をスライスする方法を示しています。

using System;
using System.Linq;

namespace array_slicing
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] a = { "one", "two", "three", "four", "five" };
            var segment = new ArraySegment<string>(a, 2, 3);
            foreach (var s in segment)
            {
                Console.WriteLine(s);
            }
        }
    }
}

出力:

three
four
five

文字列 a の配列を初期化し、ArraySegment クラスのコンストラクターを使用して、a 配列のインデックス 2 から始まる 3つの要素を含むサブ配列セグメントにスライスしました。このアプローチで配列を中央からスライスできるため、より良いアプローチです。

C# の拡張関数を使用した配列スライシング

拡張メソッドを使用すると、カスタムデータ型を宣言せずに、既存のデータ型に関数を追加できます。C# で配列をスライスするための組み込みメソッドの代わりに、ユーザー定義の拡張メソッドを定義することもできます。この拡張メソッドは、スライスの開始インデックスと終了インデックスを取得し、この範囲内のサブ配列を返すことができます。次のコード例は、C# で配列をスライスする拡張関数を定義する方法を示しています。

using System;
using System.Collections.Generic;

namespace iterate_through_a_list
{
    public static class Extensions
    {
        public static T[] Slice<T>(this T[] source, int start, int end)
        {
        if (end < 0)
        {
            end = source.Length + end;
        }
        int len = end - start;

        T[] res = new T[len];
        for (int i = 0; i < len; i++)
        {
            res[i] = source[i + start];
        }
        return res;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            string[] values = { "one", "two", "three", "four", "five" };
            string[] slice = values.Slice(2, 4);
            foreach (var s in slice)
            {
                Console.WriteLine(s);
            }
        }
    }
}

出力:

three
four
five

スライスの開始インデックスと終了インデックスを取得し、スライスされたサブ配列を返す拡張メソッド Slice() を作成しました。文字列 values の配列を初期化し、それを values 配列のインデックス 2 からインデックス 4 までの値を含む配列 slice にスライスしました。

関連記事 - Csharp Array

  • C# で配列の長さを取得する
  • C# で配列を並べ替える
  • C# で配列を降順で並べ替える
  • C# で文字列をバイト配列に変換する方法