none
重複するkeyを許容するHashtableやDictionaryなどのようなクラス RRS feed

  • 質問

  • いつもお世話になっています。

    HashtableやDictionary、SortedListのように
    キーと値がセットになっているが
    キー重複を許容するクラスを探しています。
    現在代用としてメンバ変数2つを保有するクラスを作成し
    そのオブジェクトをList<そのオブジェクト>で保持しています。

    今とても気になっているのはパフォーマンスです。
    とある著書に
    「SortedListのような、より強力なデータ構造を使用することは、
    本当にその機能が必要な場合以外には、明らかに避けるべきです。」
    と記述されており、よくそのような話を耳にします。
    なんとなくわかるのですが
    具体的になにをみて強力と判断するかといわれると
    困ってしまいます。

    上記を踏まえると希望しているクラスを探すよりも
    自分で定義した方が良いということでしょうか?

    よろしくお願いいたします。

    Use by
    WindowsXP
    .Net2.0
    VB2005

    2009年6月2日 13:48

回答

  • Hashtable や Dictionary の「値」を、List などのコレクションで持つというのはいかがでしょうか。

    もしくは STL の multimap みたいなものを自作するとか。

     CodeProject: A Concurrent Collection: MultiMap generic Collection class in C#.net - Part 2
     http://www.codeproject.com/KB/cs/MultiMap_P_2.aspx
    2009年6月2日 14:20
  • keyもvalueもstring型でよければNameValueCollectionクラス があるにはあります。.NET 1.0時代のものですので、ジェネリックに対応していません。
    あとtotojoさんがあげられているmultimap はVisual Studio 2008 (.NET 3.5)であればすでに存在します。C++のSTLですので、他言語の方にはアクセスしづらいかもしれませんが、それでもIList<T>インターフェースを実装していますので、それを使えば普通に扱えるかも…?

    「明らかに避けるべきです」なんて言われてしまうと無条件に避けてしまいそうですが、適材適所ですので、SortedListも必要な場面においては避けるべきではありません。強力かどうかではなく、その機能が必要かどうか、という点で判断すればいいでしょう。
    一例として説明すると、SortedListは名前の通り、常にソートされた状態を提供します。つまりキーを追加するごとにソートをし直します。そこからわかることは、キーの追加頻度に対して、常にソートされた状態が必要かどうか、です。

    まぁありきたりですが、目的に合致するものがあれば使うべきですし、なければ作る以外にありません。
    2009年6月2日 23:30
  • multimap はVisual Studio 2008 (.NET 3.5)であればすでに存在します。C++のSTLですので、他言語の方にはアクセスしづらいかもしれませんが、それでもIList<T>インターフェースを実装していますので、それを使えば普通に扱えるかも…?
    なるほど、その手がありましたか。

     C++/CLIのSTL/CLR オブジェクトにC#からアクセスする方法:CodeZine
     http://codezine.jp/article/detail/2474

    C# でいけるということは VB でもいけそうですね。
    2009年6月3日 15:33
  • クラスが多すぎるので迷子になりますよね。
    オブジェクトのペアというとKeyValuePair<TKey,TValue> を流用することもありますしw
    2009年6月7日 14:25

すべての返信

  • Hashtable や Dictionary の「値」を、List などのコレクションで持つというのはいかがでしょうか。

    もしくは STL の multimap みたいなものを自作するとか。

     CodeProject: A Concurrent Collection: MultiMap generic Collection class in C#.net - Part 2
     http://www.codeproject.com/KB/cs/MultiMap_P_2.aspx
    2009年6月2日 14:20
  • keyもvalueもstring型でよければNameValueCollectionクラス があるにはあります。.NET 1.0時代のものですので、ジェネリックに対応していません。
    あとtotojoさんがあげられているmultimap はVisual Studio 2008 (.NET 3.5)であればすでに存在します。C++のSTLですので、他言語の方にはアクセスしづらいかもしれませんが、それでもIList<T>インターフェースを実装していますので、それを使えば普通に扱えるかも…?

    「明らかに避けるべきです」なんて言われてしまうと無条件に避けてしまいそうですが、適材適所ですので、SortedListも必要な場面においては避けるべきではありません。強力かどうかではなく、その機能が必要かどうか、という点で判断すればいいでしょう。
    一例として説明すると、SortedListは名前の通り、常にソートされた状態を提供します。つまりキーを追加するごとにソートをし直します。そこからわかることは、キーの追加頻度に対して、常にソートされた状態が必要かどうか、です。

    まぁありきたりですが、目的に合致するものがあれば使うべきですし、なければ作る以外にありません。
    2009年6月2日 23:30
  • multimap はVisual Studio 2008 (.NET 3.5)であればすでに存在します。C++のSTLですので、他言語の方にはアクセスしづらいかもしれませんが、それでもIList<T>インターフェースを実装していますので、それを使えば普通に扱えるかも…?
    なるほど、その手がありましたか。

     C++/CLIのSTL/CLR オブジェクトにC#からアクセスする方法:CodeZine
     http://codezine.jp/article/detail/2474

    C# でいけるということは VB でもいけそうですね。
    2009年6月3日 15:33
  • totojoさん、佐祐理さんありがとうございます。

    .net3.5にはmultmapがあるんですね。
    しかもC++/CLIのSTL/CLR オブジェクトにC#からアクセスする方法があるなんて初めて知りました。
    これを機会に勉強をしたいと思います。

    残念ながら現在業務で使用しているのが.net2.0でVBなのです↓
    NameValueCollectionクラスがあるのも知りませんでした。
    ジェネリックに対応していないのは残念ですね。

    今回は時間の関係で
    観点はオブジェクト同士がペアであることと、
    そのペアが作成された順番が保証されていることが必要だったので
    ペアを保障するクラスを作成し、(メンバ変数を2つ持ち、addメソッドで2同時にオブジェクトを追加し保障する)
    それをListで保持することにしました。


    もっとクラスの土地勘をつけて頑張りたいと思います。
    ありがとうございました。
    2009年6月7日 13:40
  • クラスが多すぎるので迷子になりますよね。
    オブジェクトのペアというとKeyValuePair<TKey,TValue> を流用することもありますしw
    2009年6月7日 14:25
  • こんにちは、フォーラムオペレーターの高橋春樹です。

    totojoさん、佐祐理さん、
    いつもお世話になっております。

    natu.sさん、はじめまして。
    MSDNフォーラムのご利用ありがとうございます。

    Multimapが使用出来なくて残念です。
    自作は面倒ですが融通が利くので、それはそれで良いかも知れませんね。
    何れにせよ方向が決まって良かったです(^-^)

    今回、皆様から頂いたアドバイスが有用なものでしたので、
    勝手ながら、回答マークを付けさせて頂きました。

    今後ともMSDNフォーラムをよろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレータ 高橋春樹
    2009年6月23日 8:56