C# のマルチキー辞書? [重複] 質問する

C# のマルチキー辞書? [重複] 質問する

BCL には存在しないことはわかっていますが、優れたオープンソースのものを教えていただけますか?

マルチとは、2 つのキーを意味します。 ;-)

ベストアンサー1

私はタプルを次のようにも使っていますジェイソンの答えそうなります。ただし、タプルを構造体として定義することをお勧めします。

public struct Tuple<T1, T2> {
    public readonly T1 Item1;
    public readonly T2 Item2;
    public Tuple(T1 item1, T2 item2) { Item1 = item1; Item2 = item2;} 
}

public static class Tuple { // for type-inference goodness.
    public static Tuple<T1,T2> Create<T1,T2>(T1 item1, T2 item2) { 
        return new Tuple<T1,T2>(item1, item2); 
    }
}

.GetHashcode不変性が無料で得られます.Equals。これは (C# 4.0 を待っている間) 便利でシンプルです...

1つ警告ただし、デフォルトのGetHashcode実装(場合によっては)最初のフィールドのみ考慮する最初のフィールドを最も識別力の高いものにするか、自分で実装してください(GetHashcode例:FieldwiseHasher.Hash(this)値ユーティリティ) 、そうしないと、スケーラビリティの問題が発生する可能性があります。

また、問題を複雑にする傾向がある null を避けることもできます (null が本当に必要な場合は、Tuple<>nullable にするだけです)。少し話題から外れますが、フレームワーク レベルで非 null 参照がサポートされていないことにイライラしているのは私だけでしょうか。私は大規模なプロジェクトに取り組んでいますが、時々、null が本来は存在しないはずの場所に紛れ込んでしまいます。すると、あっという間に nullreference 例外が発生します。ただし、スタック トレースは、実際に問題のあるコードではなく、参照の最初の使用を示します。

もちろん、.NET 4.0 は今ではかなり古いので、ほとんどの人は .NET 4.0 のタプルを使用できます。

編集:GetHashCode私が書いた構造体に対して.NETが提供する貧弱な実装を回避するため値ユーティリティこれにより、マルチフィールド キーに実際の名前を使用することもできます。つまり、次のように記述できます。

sealed class MyValueObject : ValueObject<MyValueObject> {
    public DayOfWeek day;
    public string NamedPart;
    //properties work fine too
}

...これにより、少なくともそれまでは、値セマンティクスを持つデータに人間が読める名前を付けることが容易になります。C#の将来のバージョンでは、名前付きメンバーを持つ適切なタプルが実装される; できれば適切なハッシュコードで ;-)。

おすすめ記事