2

他のオブジェクトを検索するために使用したいオブジェクトがあります。を使用しDictionary<TKey, TValue>()ます。

key オブジェクトには、それを一意に識別する 2 つの文字列 ( となど) がKeyObj.Str1ありKeyObj.Str2ます。

辞書のキーとして何を使用することをお勧めしますか?

1: 文字列の連結。

Dictionary<String, TValue>();
Key = KeyObj.Str1:KeyObj.Str2; ("somestring:anotherstring")

2: 各オブジェクトを識別する一意の整数?

Dictionary<int, TValue>();
KeyObj.ID = _nextID++;
Key = KeyObj.ID;

3: オブジェクトへの参照。

Dictionary<KeyObj, TValue>();
Key = KeyObj;

オプション 3 が最も簡単ですが、参照値に基づいて辞書をインデックス化するのは効率が悪いようです。

キー オブジェクトに 1 つの一意の文字列が含まれている場合、それを使用するのは当然の選択ですが、2 つの文字列の組み合わせだけが一意であると、より困難になります。

4

9 に答える 9

2

連結された文字列が最適に機能するはずです。

それらの組み合わせが一意であることがわかっている場合は、それを選択する必要があります。ハッシュ コードは通常は一意ですが、常にそうとは限りません。

于 2009-03-20T16:02:45.263 に答える
2

GetHashCode() と Equals() を適切にオーバーライドできる場合、つまり次のように、オプション 3 を使用できます。

    public override int GetHashCode()
    {
        return str1.GetHashCode() ^ str2.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        if (!obj is KeyObj)
        {
            return false;
        }

        KeyObj key = (KeyObj)obj;
        return this.str1.Equals(key.str1) && this.str2.Equals(key.str2);
    }
于 2009-03-20T16:11:36.490 に答える
1

それらを連結することは、おそらく最良のアイデアです。連結を行うオブジェクトでプロパティを公開できるKeyObjため、辞書の値にアクセスするたびに連結を実行する必要はありません。

編集:

どうやら質問を読み間違えたようです。あなたが本当にやりたいことは 1 と 3 の組み合わせだと思います。オーバーライドEquals()して、オブジェクトを一意に識別する sGetHashCode()を使用できます (それらが不変であることを確認してください!)string

public override Equals(object obj) 
{
   if (obj == null || !(obj is KeyObj))
      return false;
   KeyObj other = (KeyObj)obj;
   if (this.Key1 == other.Key1 && this.Key2 == other.Key2)
     return true;
   return false;
}

public override GetHashCode()
{
    return (this.Key1 + this.Key2).GetHashCode();
}

次に、提案した3番目のオプションを使用できます:

Dictionary<KeyObj, ValueObj>...
于 2009-03-20T16:01:55.437 に答える
1

KeyObj.GetHashCode() の使用はどうですか?

于 2009-03-20T16:02:07.810 に答える
1

それらのいずれも有効ですが、2 つの文字列のいずれかに基づいてこれらのオブジェクトをすばやく見つけられるようにしたいので、int をキーとして使用すると、値をスキャンして値をスキャンする必要があることを意味します。あなたが欲しかったオブジェクトを見つけます。

文字列は両方とも一意ですか、それとも組み合わせた場合のみですか? それらが両方ともユニークで、少しスペースを交換しても構わないと思っている場合は、次のことができます。

dict.Add(KeyObj.Str1, KeyObj);
dict.Add(KeyObj.Str2, KeyObj);

それぞれの一意の文字列をキーとして使用して、ディクショナリ内のオブジェクトへの 2 つの参照を持ちます。または、文字列が一意である場合はいつでも文字列を組み合わせることができ、内部でハッシュコードを使用してそれらを検索します。

于 2009-03-20T16:02:28.120 に答える
0

ディクショナリは美化されたハッシュ テーブルであることを忘れないでください。そのため、キー (しゃれは意図されていません) は、別のキーとの衝突が (あったとしても) 非常に少ないキーを使用することです。私は #3 に傾倒しますが、これは KeyObj 型に優れたハッシュ値ジェネレーターがあることを前提としています。

于 2009-03-20T16:03:04.983 に答える
0

ディクショナリ キーとして新しいクラスを使用する必要はありません。代わりに新しい構造体を使用すると、はるかに軽量になります...そして、それらの2つの文字列値で構成されていることは明らかです。

于 2009-03-20T15:58:54.383 に答える
0

パフォーマンスが重要な考慮事項である場合は、2 つの文字列のハッシュ値を使用することを検討できます。ただし、「値」フィールドにはキーと値の両方を含める必要があります。

別のSOの質問への参照があります。それを見つける必要があります。

ハッシュコードでDB内の大きな文字列を検索する方が速いですか?

しかし、その質問はよりDB指向です。そして、パフォーマンスは何千回もの反復で考慮されます。

于 2009-03-20T16:00:09.623 に答える