4

ディクショナリ内の 2 つのキーで値にインデックスを付ける最良の方法は何ですか。例: 学生に一意の ID (整数) とユーザー名 (文字列) を持たせると、ID とユーザー名でインデックス付けされた学生タイプのオブジェクトを保持する辞書が作成されます。次に、取得時に Id またはユーザー名のいずれかを使用します。または、辞書が適切に一致しない可能性がありますか? PS私はタプルを知っていますが、このシナリオでどのように使用できるかわかりません。

編集: 2 つのキーを使用する代わりに、一意の区切り記号で区切られた ID とユーザー名の両方の文字列表現を作成し、正規表現を使用してキーを一致させることができますか?! 例:「1625|user1」

4

4 に答える 4

8

どちらでも取得できるようにしたいので、2 つの辞書が必要になります。

Student型が参照型であると仮定すると、Student学生ごとにオブジェクトが 1 つしかないため、心配する必要はありません。

辞書を単一のオブジェクトにラップするのが最善です。

public class StudentDictionary
{
  private readonly Dictionary<int, Student> _byId = new Dictionary<int, Student>();
  private readonly Dictionary<string, Student> _byUsername = new Dictionary<string, Student>();//use appropriate `IEqualityComparer<string>` if you want other than ordinal string match
  public void Add(Student student)
  {
    _byId[student.ID] = student;
    _byUsername[student.Username] = student;
  }
  public bool TryGetValue(int id, out Student student)
  {
    return _byId.TryGetValue(id, out student);
  }
  public bool TryGetValue(string username, out Student student)
  {
    return _byUsername.TryGetValue(username, out student);
  }
}

等々。

于 2012-09-05T13:24:47.637 に答える
3

同期している 2 つの辞書を使用できます。1 つは名前を学生にマッピングし、もう 1 つは ID を学生にマッピングします。最も簡単な方法は、おそらく同期を処理する独自のクラスでラップすることです。

于 2012-09-05T13:20:12.280 に答える
2

いいえ、 aは常に と の両方をTuple持っている場合にのみ役立ちます。各キーにa を使用できます。タイプが異なる場合、両方のキーを照会できるようにする独自の実装もできます。IdUsernameDictionariesDictionary

class MyDictionary : IDictionary<int, Student>, IDictionary<string, Student> {
    // full implementation
}
于 2012-09-05T13:20:56.987 に答える
0

学生オブジェクトを使用することは、目的に適したオプションですが、適切に機能させるには、等価関数 (Equals および GetHashCode) をオーバーライドする必要があります。

この部分をより注意深く読んだ後に編集してください。私は2つの辞書を使用するので、@ JonHannaに+1します。

于 2012-09-05T13:21:48.687 に答える