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行目を変更して、 HashSet を SortedHashにするだけです。
var set1 = new SortedSet();
実行結果は、次のように確かに要素がソートされていることが確認できます。
a
b
c
x
通常、要素をソートする必要性がない場合は HashSet を利用、ソートしていたほうが都合が良い場合は SortedSet を利用します。