1

含む構造体がある場合

public struct MyStruct
{
    public int Id1;
    public int Id2;
    public string Name;
    public int ValueToFind;
}

それらをどのように保存および取得する必要がありますか? 2つのオプションしか思い浮かびません

  1. 私が見つけて壊れるまでそれらをList<MyStruct>anhdループに入れてください
  2. それらをキーとしてディクショナリに保存しTuple<int, int, string>、ValueToFindを値として保存します

後者は、その構造体として使用したいので、あまり便利ではありません。高速検索のために最初の 3 つのフィールドにデータベース インデックスのようなものを使用するコレクションはありますか?

-マティ

4

2 に答える 2

1

適切なキーを使用することをおDictionary<TKey, TVAlue>勧めします。構造体をディクショナリに格納できます。これにより、高速な検索と挿入が可能になります (に近いO(1))。

を必要としないような単純な構造の場合はTuple、これを試してください。

public struct MyStructKey
{
    public int Id1;
    public int Id2;
    public string Name;
}

public struct MyStruct
{
    public MyStructKey Key;
    public int ValueToFind;
}

そして、例えば:

static void Main()
{
  Dictionary<MyStructKey, MyStruct> d = new Dictionary<MyStructKey, MyStruct>();

  MyStruct ms = new MyStruct()
  {
    Key = new MyStructKey() { Id1 = 0, Id2 = 0, Name = string.Empty },
    ValueToFind = 4
  };

  d.Add(ms.Key, ms);

  Console.WriteLine(d[ms.Key].ValueToFind);
}

別の方法Dictionary<MyStructKey, int>として、データの重複を避け、まったく使用しないようにすることもできますMyStruct

于 2013-09-15T17:50:40.153 に答える
0

組み込みのハッシュテーブルベースの型により、正確なキーの型とは異なるもので検索するのが少し難しくなります。それが可能になるのを妨げるハッシュの理論については何もありませんが、現時点では BCL では不可能です。

ビルトインでルックアップを実行するには、 にDictionaryGetHashCode および Equals メソッドを提供する必要がありますMyStruct。次に、関連する 3 つのフィールドが設定された の部分的に入力されたインスタンスを渡し、MyStructそれらからハッシュ コードと等価結果を計算する必要があります。

より洗練されたソリューションが必要な場合は、ルックアップ キーとして新しい構造体を使用します。

public struct MyStructKey
{
    public int Id1;
    public int Id2;
    public string Name;
}

この新しい構造体をキーとするすべての項目をDictionary. メソッドを提供する等値コードとハッシュ コードを必ずオーバーライドしてください。

于 2013-09-15T18:41:17.797 に答える