C# のセットの利用方法 (HashSet と SortedHash)

C# のセットとは?

C# のコレクションに出てくる「セット」(set) というのは、数学でいう「集合」の意味です。

データ構造のセットは通常、ある要素が存在するかどうかの確認するときや、複数の要素のグループの包含関係などを調べる必要があるときに使います。

ジェネリック・コレクションで使えるセットとして HashSet と SortedHash を取り上げて説明します。

C# の HashSet の使い方

T 型の HashSet を作成するには new HashSet<T>() とします。

次の例では char 型の HashSet を作成して、 'A''B''C' という三つの要素で初期化しています。

using static System.Console;
using System.Collections.Generic;

class TestApp
{
  public static void Main(string[] args)
  {
    var hs1 = new HashSet<char>() {
      'A', 'B', 'C'
    };

    WriteLine($"Contains 'B'? {hs1.Contains('B')}");
    // Contains 'B'? True
  }
}

この例のように Contains() メソッドを使うと、特定の値が要素として含まれているかチェックできます。

二つの HashSet の和集合を作成する

二つのセットのいずれかに属する要素でできた集合 (和集合) を作成するには、セットの UnionWith() メソッドを使います。 メソッドを呼び出したセットは、結果の集合に書き換えられます。

using static System.Console;
using System.Collections.Generic;

class TestApp
{
  public static void Main(string[] args)
  {
    var hs1 = new HashSet<char>() {
      'A', 'B', 'C'
    };

    var hs2 = new HashSet<char>() {
      'C', 'D', 'E'
    };

    hs1.UnionWith(hs2);

    foreach (var ch in hs1)
    {
      Write($"{ch}");
    }
    // ABCDE
  }
}

二つの HashSet の共通部分を作成する

二つのセットのどちらにも属する要素でできた集合 (共通部分) を作成するには、セットの IntersectWith() メソッドを使います。 メソッドを呼び出したセットは、結果の集合に書き換えられます。

using static System.Console;
using System.Collections.Generic;

class TestApp
{
  public static void Main(string[] args)
  {
    var hs1 = new HashSet<char>() {
      'A', 'B', 'C'
    };

    var hs2 = new HashSet<char>() {
      'C', 'D', 'E'
    };

    hs1.IntersectWith(hs2);

    foreach (var ch in hs1)
    {
      Write($"{ch}");
    }
    // C
  }
}

C# の SortedSet の使い方

HashSet ではセット内の要素の序列が保障されていません。

例として、HashSet を作りそれに要素を "b", "a", "c", "a", "x" の順で追加し、要素の内容を出力します。

using static System.Console;
using System.Collections.Generic;

namespace collection1
{
  class Program
  {
    static void Main(string[] args)
    {
      var set1 = new HashSet();
      set1.Add("b");
      set1.Add("a");
      set1.Add("c");
      set1.Add("a");
      set1.Add("x");
      foreach (var s in set1)
      {
        WriteLine($"{s}");
      }
    }
  }
}

実行結果は次の通り。

b
a
c
x

a を二回追加 (Add メソッドを二回呼び出し) していても、セットにはひとつしか追加されていません。

一方、SortedSet ではセットに追加された要素がソートされます。

基本的な使い方は HashSet と同様です。10行目を変更して、 HashSetSortedHashにするだけです。

      var set1 = new SortedSet();

実行結果は、次のように確かに要素がソートされていることが確認できます。

a
b
c
x

通常、要素をソートする必要性がない場合は HashSet を利用、ソートしていたほうが都合が良い場合は SortedSet を利用します。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 C# 入門