C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のSortedSetでサブセット(部分集合)を取得する方法|GetViewBetweenの使い方

C#のSortedSet<T>から部分集合(サブセット)を取り出したい場合は、GetViewBetweenメソッドを使います。このメソッドに下限値と上限値を渡すと、その範囲に含まれる要素だけを列挙できる新しいSortedSet<T>(ビュー)が返されます。

GetViewBetweenメソッドの基本

GetViewBetween(lowValue, highValue)は、セット内の要素のうち「lowValue以上・highValue以下」の範囲に該当する要素を取得するためのメソッドです。SortedSetは常にソートされた状態を保っているため、範囲指定による部分集合の抽出を効率的に行えます。
また、指定した下限・上限の値が実際にセット内に存在しない場合でも、比較器に基づいて適切に範囲が切り取られるという特徴があります。

例1:文字列のSortedSetでサブセットを取得する

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main() {
      SortedSet<string> set1 = new SortedSet<string>();
      set1.Add("AB");
      set1.Add("BC");
      set1.Add("CD");
      set1.Add("EF");

      Console.WriteLine("SortedSet1の要素...");
      foreach (string res in set1) {
         Console.WriteLine(res);
      }

      SortedSet<string> set2 = new SortedSet<string>();
      set2.Add("BC");
      set2.Add("CD");
      set2.Add("DE");
      set2.Add("EF");
      set2.Add("AB");
      set2.Add("HI");
      set2.Add("JK");

      Console.WriteLine("SortedSet2の要素(列挙子を使用)...");
      SortedSet<string>.Enumerator demoEnum = set2.GetEnumerator();
      while (demoEnum.MoveNext()) {
         string res = demoEnum.Current;
         Console.WriteLine(res);
      }

      // 「CD」から「EF」までの範囲のビューを取得
      SortedSet<string> set3 = set2.GetViewBetween("CD", "EF");

      Console.WriteLine("SortedSet3の要素...");
      foreach (string res in set3) {
         Console.WriteLine(res);
      }
   }
}

実行結果

SortedSet1の要素...
AB
BC
CD
EF
SortedSet2の要素(列挙子を使用)...
AB
BC
CD
DE
EF
HI
JK
SortedSet3の要素...
CD
DE
EF

set2には7つの要素が登録されていますが、GetViewBetween("CD", "EF")を呼び出すことで、「CD」以上「EF」以下に該当する3つの要素(CD・DE・EF)だけを含むset3が得られていることがわかります。

例2:数値のSortedSetでサブセットを取得する

続いて、int型のSortedSetから150〜400の範囲を取り出す例を見てみましょう。

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main() {
      SortedSet<int> set1 = new SortedSet<int>();
      set1.Add(50);
      set1.Add(100);
      set1.Add(150);
      set1.Add(200);
      set1.Add(250);
      set1.Add(300);
      set1.Add(350);
      set1.Add(400);
      set1.Add(450);
      set1.Add(500);

      Console.WriteLine("SortedSet1の要素...");
      foreach (int res in set1) {
         Console.WriteLine(res);
      }

      // 150以上400以下のビューを取得
      SortedSet<int> set2 = set1.GetViewBetween(150, 400);

      Console.WriteLine("SortedSet2の要素...");
      foreach (int res in set2) {
         Console.WriteLine(res);
      }
   }
}

実行結果

SortedSet1の要素...
50
100
150
200
250
300
350
400
450
500
SortedSet2の要素...
150
200
250
300
350
400

まとめ・利用時の注意点

  • セット内に存在しない値でも指定可能: 下限・上限に実際の要素として存在しない値を渡しても、比較器に基づいて正しく範囲が切り取られます。
  • 下限と上限の順序に注意: 比較順序において下限値が上限値より大きくなるような指定をすると例外がスローされるため、引数の順番には注意しましょう。
  • 戻り値は元のセットのビュー: GetViewBetweenが返すのは独立したコピーではなくビューであり、ビュー側での追加・削除は元のSortedSetにも反映されます。

このように、C#のSortedSetではGetViewBetweenメソッドひとつで簡単にサブセット(部分集合)を取得できます。ソート済みデータの中から特定の範囲だけを扱いたい場面で、ぜひ活用してみてください。

  1. C#で読み取り専用プロパティ(readonly)を追加する方法をわかりやすく解説

    C#では、readonlyキーワードを使ってフィールドを読み取り専用にすることができます。readonlyが付いたフィールドは、オブジェクトの構築時に一度だけ値を設定でき、その後は変更することができません。変更しようとするとコンパイルエラーが発生します。ここでは、C#で読み取り専用のフィールドやプロパティを扱う方法について、具体例を交えながら詳しく解説します。readonlyフィールドの基本的な使い方まずは、readonlyフィールドを持つクラスの例を見てみましょう。class Employee { readonly int salary; Employee(int sala

  2. iOS 15の入手方法|iPhoneへのインストール手順と注意点を徹底解説

    Appleは毎年、iPhone全機種に搭載されるオペレーティングシステム「iOS」の大型アップデートを発表します。メジャーバージョンの更新では、新機能の追加、インターフェースの改良、重要なセキュリティパッチの適用が行われます。しかも、そのすべてが無料で利用できるのが魅力です。 最新バージョンとなるiOS 15は、2021年9月20日よりダウンロードとインストールが可能になりました。この記事では、iPhoneにiOS 15をインストールする方法を詳しく解説し、アップデート時に遭遇しがちなトラブルへの対処法もあわせてご紹介します。 iOS 15はいつ配信される? 米国では太平洋夏時間(PDT)の午