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

Muhammad Maisam Abbas 2024年2月16日
  1. C# の Linq メソッドを使用した配列スライシング
  2. C# の ArraySegment クラスを使用した配列スライシング
  3. C# の拡張関数を使用した配列スライシング
C# での配列スライシング

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

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 にスライスしました。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

関連記事 - Csharp Array