2012-11-30 126 views
0

我的字典键是另一个字典。如何查看我的dictonary(“游戏”)ContainsKey“myname”例如? 我有这样的事情:C#字典键作为字典

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); 
    } 
} 

回答

1

我想你想的

Games 
    ChatRooms 

层次取决于你可能会想存储在一个字典实际聊天室的实际需求,而在另一个字典每场比赛的聊天室“指数”。访问实际的聊天变成两个步骤:每场比赛的聊天室从_chatRoomsPerGame字典

    1. 获取列表获取从_allChatRooms字典中的实际聊天室。

    尽管可以创建自己的对象来托管字典并重写GetHashKey以使用其他字典的键创建字典,但我怀疑这是您真正想要的。

  • 0
    games.Keys.SelectMany(x => x.Keys).Contains("myname") 
    
    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")); 
    } 
    
    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不是不可变的。

    +0

    这不是一个好主意,请参阅@dasblinkenlight答案。 –

    0

    试试这个

    var innerDictionary = rooms.Keys.Where(innerdict => innerdict.ContainsKey(roomName))); 
    
    3

    这是行不通的:两个相同组成的词典不会比为彼此相等(link to ideone)。

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

    一般来说,你不应该在字典上输入任何可变的字典。制定一种将字典转换为“规范string表示形式”的方法,并使用该字典作为字典中的键。