0

私のディクショナリ キーは別のディクショナリです。たとえば、自分のディクショナリ ("games") に "myname" が含まれているかどうかを確認するにはどうすればよいですか? 私はこのようなものを持っています:

Dictionary<string,List<ChatClient>> rooms = new Dictionary<string, List<ChatClient>>();
Dictionary<Dictionary<string, List<ChatClient>>, IGame> games = new Dictionary<Dictionary<string, List<ChatClient>>, IGame>();

public void CreateAGame(string roomName, IGame game) {
     if (rooms.ContainsKey(roomName)) {
         games.Add(rooms, game);
     }
}
4

6 に答える 6

3

これは機能しません: 2 つの同一に構成された辞書は、互いに等しいものとして比較されません ( ideone へのリンク)。

var a = new Dictionary<string,string> {{"a","a"}};
var b = new Dictionary<string,string> {{"a","a"}};
Console.WriteLine(a.Equals(b));

一般に、変更可能なものに辞書をキー付けするべきではありません。辞書を「正規string表現」に変換するメソッドを作成し、それstringを辞書のキーとして使用します。

于 2012-11-30T11:33:07.873 に答える
1

の階層が必要だと思います

Games
    ChatRooms

実際の要件によっては、実際のチャット ルームを 1 つのディクショナリに格納し、ゲームごとのチャット ルームの「インデックス」を別のディクショナリに格納することをお勧めします。実際のチャットへのアクセスは 2 ステップのプロセスになります。

  1. _chatRoomsPerGame ディクショナリからゲームごとのチャット ルームのリストを取得します
  2. _allChatRooms ディクショナリから実際のチャット ルームを取得します。

独自のオブジェクトを作成して辞書をホストし、GetHashKey をオーバーライドして他の辞書のキーを使用して辞書を作成することは可能ですが、それが本当に必要かどうかは疑問です。

于 2012-11-30T11:53:58.950 に答える
1
public void ContainsDictKey(Dictionary<Dictionary<string, List<ChatClient>>, IGame> games, string key)
{
    foreach(var l in games)
    {
        if(l.Key.ContainsKey(key))
            return true;
    }
    return false;
}

ただし、これが良いアイデアかどうかはわかりません。キーは不変である必要がありますが、Dictionary は不変ではありません。

于 2012-11-30T11:32:30.717 に答える
0
games.Keys.SelectMany(x => x.Keys).Contains("myname")
于 2012-11-30T11:32:08.120 に答える
0

次のようなものがあります。

私たちが持っている場合:

 Dictionary<Dictionary<string, List<ChatClient>>, IGame> games = 
               new Dictionary<Dictionary<string, List<ChatClient>>, IGame>();

そして、いくつかの機能で

public IEnumerable<T> GetByName(string myName) {
    return games.Keys.Where(x=>x.Contains("myName"));
}
于 2012-11-30T11:32:28.347 に答える
0

これを試して

 var innerDictionary = rooms.Keys.Where(innerdict => innerdict.ContainsKey(roomName)));
于 2012-11-30T11:32:38.667 に答える