2012-09-21 26 views
1

獲得的值。如果我有這樣的ConcurrentDictionary:從ConcurrentDictionary

public class User 
{ 
    public string Context { get; set; } 
    public bool Owner { get; set; } 
} 

protected static ConcurrentDictionary<User, string> OnlineUsers = new ConcurrentDictionary<User, string>(); 

有誰知道我怎麼會得到Owner的價值,如果我已經有Context的價值?基本上我想用Context做一個「查找」。謝謝。

+1

莫不是以相同的語境不止一個用戶對象,如果是的話,你希望讓所有的人? – hatchet

+0

編號上下文對每個用戶都是唯一的。 :) –

回答

0

這聽起來像你需要一個Dictionary<string, User>,當給定的背景下作爲string會告訴你它對應的User。如果您需要多次執行此查找,並且使用額外的內存沒有問題,則可能值得創建這樣的字典。

如果您只打算進行一次或兩次搜索,或者映射頻繁更改以至於無法保持字典最新,那麼您可以簡單地使用字典進行線性搜索或者使用LINQ方法,如FirstWhere,如其他答案中所示。

2

做任何事情,從使用標準的LINQ FirstOrDefault()方法,像這樣阻止你:

var item = OnlineUsers.FirstOrDefault(kvp => kvp.Key.Context == myContext); 
+0

好吧,你正在字典上進行線性搜索,這或多或少地破壞了使用字典的目的(儘管我不認爲沒有重新設計就沒有任何選擇。 – Servy

+0

嗯,答案是假設OP想要一個用戶對象作爲其他目的的關鍵,並希望找出如何在僅僅處理上下文而不是整個對象的情況下搜索一個值,但是,如果可以重新設計,那麼你是對的,那麼這是正確的做法 –

+0

正如問題所述,我不認爲有一個答案比線性更好,字典是關鍵用戶,而不是關鍵字。 – hatchet

2

如何obout像

var ou = OnlineUsers.First(x => x.Key.Context == "TADA"); 
0

在這裏你去:

ConcurrentDictionary<User, string> dict = new ConcurrentDictionary<User, string>(); 

dict.TryAdd(new User() { Context = "a", Ownder = false }, "aa"); 
dict.TryAdd(new User() { Context = "b", Ownder = false }, "bb"); 
dict.TryAdd(new User() { Context = "c", Ownder = true }, "cc"); 
dict.TryAdd(new User() { Context = "d", Ownder = false }, "dd"); 

IEnumerable<User> list = dict.Keys.Where(p => p.Context == "a"); 
相關問題