web-dev-qa-db-ja.com

キーごとに2つの値を持つC#辞書?

コードにDictionary<string, string>は最高のアイデアのように思えました。これらのオブジェクトのコレクションが必要であり、一意のキーを介してアクセスできる必要があります。ディクショナリの概念の目的は何ですか?

さて、要件は、キーごとに追加の情報(必要に応じてブール値)を保持する必要があるところまで拡大しました。

したがって、概念を拡張して、文字列とブール値を使用して新しいデータ構造を作成し、Dictionary<string, NewCustomObject>

ただし、ブールフラグのような追加値が1つだけの場合は、過剰に感じられます。それでも、キーごとに2つの値を持つディクショナリのような汎用オブジェクトは知りません。

これを行うには、カスタムオブジェクトのディクショナリを使用するのが最善の方法ですか、それともこのシナリオにはもっと簡単なものがありますか?

38
Tom Kidd

実際、今説明したことは、Dictionaryコレクションの理想的な使用法です。値のタイプに関係なく、キーと値のペアを含むことになっています。値を独自のクラスにすることで、必要が生じた場合に将来簡単に拡張できるようになります。

32
class MappedValue
{
    public string SomeString { get; set; }
    public bool SomeBool { get; set; }
}

Dictionary<string, MappedValue> myList = new Dictionary<string, MappedValue>;
13
Ed S.

一般的にあなたはタプルの概念に入ると思います-Tuple<x, y, z>、またはTuple<string, bool, value>

C#4.0はタプルを動的にサポートしますが、それ以外は、独自にロールするか、タプルライブラリをダウンロードする必要があります。

ここで私の答えを見ることができます 汎用タプルクラスのサンプルコードを配置します。または、ここに再投稿することができます:

public class Tuple<T, T2, T3>
{
    public Tuple(T first, T2 second, T3 third)

    {
        First = first;
        Second = second;
        Third = third;
    }

    public T First { get; set; }
    public T2 Second { get; set; }
    public T3 Third { get; set; }

}
7
womp

.NET4では、以下を使用できます(チェックなし):Dictionary<string, Tuple<bool,string>>

6
Henk Holterman

.netにはMulti-Mapが組み込まれているとは思わないが、これは通常、このタイプのストレージを実行するために使用できるデータ構造です。一方、文字列とブール値の両方を保持するカスタムオブジェクトを使用するだけでは、やり過ぎだとは思いません。

3
Ralph Caraveo

これはyaには機能しませんか?

Dictionary<string, List<string>>

または、 Tuple を使用して、その辞書を作成することもできます。

Dictionary<string, Tuple<string, bool>>
2
Mehrdad Afshari

タプルは常に良い解決策です。さらに、オブジェクト指向のアプローチでは、常に継承よりも合成を優先します。グループ化を行う複合オブジェクトを構築します。単に。ここでは、仲間のstackoverflow'ersからのいくつかの素敵でクリーンなソリューションで覆われていると思います。 :)

1

辞書は、オブジェクトのキー付きコレクションです。そのため、任意のタイプのオブジェクトを保持します。 array(Objectから派生)などの最も単純なオブジェクトでも、必要なコードははるかに少なくなります。

クラス全体を記述するのではなく、動的に割り当てられた配列、または値にリストを詰めて実行します。

辞書はそのように非常に柔軟です。

0
Mike Hofer

ルックアップ クラスはどうですか?

編集:

質問を注意深く読んだ後、これは最良の解決策ではないと思いますが、単一のキーごとにいくつかの値がある辞書にとってはまだ良い解決策だと思います。

0
Kamarey

別のアイデアは、ブール値を別のデータ構造に保存することです。 HashSet。

0
reinierpost