.NET TIPS

要素を重複なく管理するには?(HashSetクラス編)[3.5、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2008/06/19

 何らかの要素(オブジェクト)を、重複を省いて一覧として保持したい場合がある。例えば、項目を重複なく処理するために、すでに処理済みの項目一覧を保持しておき、次に処理すべき項目がすでに一覧にあれば何もせず、なければ一覧に加えて処理を行うといった場合である。

.NET Framework 2.0ではDictionaryクラス

 上記のような処理は.NET Framework 2.0であれば、Dictionaryクラス(System.Collections.Generic名前空間)を使用するのが一般的であった(Dictionaryクラスについては「TIPS:ハッシュテーブル(連想配列)を使うには?(Dictionaryクラス編)」を参照)。

 次のコードは、英文中に現れる単語を重複せずに表示するサンプル・プログラムである。すでに表示した英単語をDictionaryクラスで管理している。

// dictionary.cs

using System;
using System.Collections.Generic;

class Program {
  static void Main() {

    string lincoln =
      "government of the people by the people for the people";

    // Dictionaryクラスによる単語テーブル
    Dictionary<string, object> dictTable
      = new Dictionary<string, object>();

    foreach (string word in lincoln.Split(' ')) {

      // 単語が未登録なら追加してから表示
      if (!dictTable.ContainsKey(word)) {
        dictTable.Add(word, null);
        Console.WriteLine(word);
      }
    }
    // 出力:
    // government
    // of
    // the
    // people
    // by
    // for

  }
}

// コンパイル方法:csc dictionary.cs
Dictionaryクラスを使用した単語の重複管理(C#)

' dictionary.vb

Imports System
Imports System.Collections.Generic

Class Program
  Shared Sub Main()

    Dim lincoln As String = _
      "government of the people by the people for the people"

    ' Dictionaryクラスによる単語テーブル
    Dim dictTable As New Dictionary(Of String, Object)

    For Each word As String In lincoln.Split(" ")

      ' 単語が未登録なら追加してから表示
      If Not dictTable.ContainsKey(word) Then
        dictTable.Add(word, Nothing)
        Console.WriteLine(word)
      End If

    Next
    ' 出力:
    ' government
    ' of
    ' the
    ' people
    ' by
    ' for
  End Sub
End Class

' コンパイル方法:vbc dictionary.vb
Dictionaryクラスを使用した単語の重複管理(VB)

 Dictionaryクラスはキーと値のペアを、キーが重複しないように保持するが、本稿のような用途ではキーのみで用が足りるため、値の方は未使用となる(上記のコードではnull/Nothingを取りあえず入れている)。

.NET Framework 3.5ではHashSetクラス

 .NET Framework 3.5では、要素を重複なく格納するためのHashSetクラス(System.Collections.Generic名前空間)が新しく追加されている。いうなれば、このクラスはキーだけを保持するDictionaryクラスのようなものだ。

 HashSetクラスでも新しい要素を追加するのにAddメソッドを使用するが、HashSetクラスのAddメソッドは少し便利になっており、すでに要素が存在していた場合にはfalseを返し、要素が追加できた場合にtrueを返すようになっている(DictionaryクラスのAddメソッドは、すでに要素が存在していると例外を発生する)。

 HashSetクラスを使用して上記のサンプル・プログラムを書き換えると次のようになる。

// hashset.cs

using System;
using System.Collections.Generic;

class Program {
  static void Main() {

    string lincoln =
      "government of the people by the people for the people";

    // HashSetクラスによる単語テーブル
    HashSet<string> hsTable = new HashSet<string>();

    foreach (string word in lincoln.Split(' ')) {

      // 単語を追加。未登録なら表示
      if (hsTable.Add(word)) {
        Console.WriteLine(word);
      }
    }
    // 出力:
    // government
    // of
    // the
    // people
    // by
    // for

  }
}

// コンパイル方法:csc hashset.cs
HashSetクラスを使用した単語の重複管理(C#)

' hashset.vb

Imports System
Imports System.Collections.Generic

Class Program
  Shared Sub Main()

    Dim lincoln As String = _
      "government of the people by the people for the people"

    ' HashSetクラスによる単語テーブル
    Dim hsTable As New HashSet(Of String)

    For Each word As String In lincoln.Split(" ")

      ' 単語を追加。未登録なら表示
      If hsTable.Add(word) Then
        Console.WriteLine(word)
      End If

    Next
    ' 出力:
    ' government
    ' of
    ' the
    ' people
    ' by
    ' for
  End Sub
End Class

' コンパイル方法:vbc hashset.vb
HashSetクラスを使用した単語の重複管理(VB)

 HashSetクラスには、2つのHashSetオブジェクトの和集合や差集合、積集合といった集合演算を行うメソッド(Unionメソッド、Exceptメソッド、Intersectメソッド)なども用意されている。End of Article

利用可能バージョン:.NET Framework 3.5以降
カテゴリ:クラス・ライブラリ 処理対象:コレクション
使用ライブラリ:Dictionaryクラス(System.Collections.Generic名前空間)
使用ライブラリ:HashSetクラス(System.Collections.Generic名前空間)
関連TIPS:ハッシュテーブル(連想配列)を使うには?(Dictionaryクラス編)

この記事と関連性の高い別の.NET TIPS
ハッシュテーブル(連想配列)を使うには?(Dictionaryクラス編)
Dictionaryクラスを簡単に初期化するには?
ハッシュテーブル(Dictionaryクラス)を値でソートするには?
ハッシュテーブル(連想配列)を使うには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH