C#ライブラリリファレンス - データを集合として扱う
集合としてデータを扱いたい場合は、ハッシュセット(HashSet)ジェネリックオブジェクトを使用します。
日常でたとえると
子猫の集まりと、子犬の集まりを合体させたら、すごい癒し空間になるよ。
使用に適した状況
集合論でデータを扱いたい場合に使用します。集合論の使用できる場面は、あらゆる状況だといえますが、他にもコンテナオブジェクト(リストやディクショナリー)があるので常用する必然性はありません。データベースとの連携で使用するとよいでしょう。
サンプル
/*----------------------------------------------------
*
* ハッシュセット(集合)の使い方
*
----------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
class Sample
{
static void Main( )
{
//男性の偉人リストを作成
var man = new HashSet<string>();
man.Add( "坂本龍馬" );
man.Add( "西郷隆盛" );
man.Add( "織田信長" );
man.Add( "武田信玄" );
man.Add( "マハトマ・ガンディー" );
PrintNumbers( "男性の偉人リスト", man );
//女性の偉人リストを作成
var women = new HashSet<string>();
women.Add( "紫式部" );
women.Add( "ジャンヌダルク" );
women.Add( "卑弥呼" );
women.Add( "エカチェリーナ" );
women.Add( "清少納言" );
PrintNumbers( "女性の偉人リスト", women );
//偉人に性別なんて関係がない
var human = new SortedSet<string>( man );
human.UnionWith( women ); //集合ならでは
PrintNumbers( "偉人リスト", human );
//集合演算を試す
SetOperator( man, women, human );
//終了
Console.ReadLine();
}
//数値を表示。
private static void PrintNumbers(
string tile,
IEnumerable<string> datas )
{
Console.WriteLine( "***** {0} *****", tile );
foreach ( var d in datas )
Console.WriteLine( "{0} ", d );
Console.WriteLine();
}
//集合演算を試す
private static void SetOperator(
HashSet<string> man,
HashSet<string> women,
SortedSet<string> human )
{
//子集合を判定
Console.WriteLine(
"男性の偉人リストは、偉人リストの子? : {0}",
human.IsSupersetOf( man ) );
Console.WriteLine(
"女性の偉人リストは、偉人リストの子? : {0}",
human.IsSupersetOf( women ) );
Console.WriteLine(
"女性の偉人リストは、男性の偉人リストの子? : {0}",
man.IsSupersetOf( women ) );
Console.WriteLine();
//親集合を判定
Console.WriteLine(
"偉人リストは男性の偉人リストの親? : {0}",
man.IsSubsetOf( human ) );
Console.WriteLine(
"偉人リストは女性の偉人リストの親? : {0}",
women.IsSubsetOf( human ) );
Console.WriteLine(
"女性の偉人リストは、男性の偉人リストの親? : {0}",
women.IsSupersetOf( man ) );
}
}
名前空間
ハッシュセットジェネリックオブジェクトは、System.Collections.Genericにあります。集合を扱いたい時は、LINQプログラミングが役立ちます。System.Linq名前空間も参照しましょう。
解説
データベースを扱う人で必須知識の集合論があります。集合論では、データを「物の集まり」だと考え、個々ではなく、一度にたくさんのデータを操作します。マスターすると、大変有効にデータを活用できるようになります。
C#で集合を扱いたい場合、HashSetクラスを使用するのが自然です。ですが、昨今では、LINQプログラミングの守備範囲と重なり、IEnumerableインタフェースを実装したオブジェクトであれば、集合指向プログラミングができるので微妙な立場です。とはいえ、プログラムに明示性を持たせるのは大切なので、集合で扱いたいことを明示するために、HashSetクラスとLINQプログラミングを使うとよいと思います。