2010-10-21 118 views
3

我正在解析一個文件,我想以一種可以用兩個鍵查找的方式將其存儲在查找結構中。字典的多鍵查找

我有一個User Entityname, emailid,類型是無關緊要的。

我想將它存儲在Dictionary<User, id>中,這樣我可以通過用戶查找來獲取用戶ID。

我也希望周圍的其他方法,即:Dictionary<Id, User>

我可以創建兩個結構,並做了查找。這很容易。我想用一個單一的結構來做。

我很好奇,如果我能做到這一點單一結構

我在想,我可以這樣做:

Dictionary<User, User>,然後實施IEqualityComparer<User>

有沒有更好的方式來做到這一點?

實施IEqualityComparer的最佳做法是什麼?

+0

由於id爲用戶對象,當你想從一個特定對象獲得ID只是USER.ID上的屬性。但是,我猜你想做相反的事情,即使id不公開嗎? – 2010-10-21 20:04:04

+0

我不認爲你明白我問了什麼。我可以將用戶對象存儲爲密鑰,然後我不能僅通過id進行查找。 – DarthVader 2010-10-21 20:05:16

回答

1

無論你需要做這種類型的映射與否,你可以使用一個字典來像你問什麼。這裏有一個粗略的例子:

var dict = new Dictionary<string, object>(); 
dict["ID_001"] = new User(); 
dict["USER_??"] = 001; // Need a unique user string to replace the "??" 

當然,你可以組成任何你想要的字符串。如果你想圍繞東西包裝功能,你可以避免每次獲得物品時都需要投射物體。 (靜態方法可能會更好地爲您。)

User GetUser(int id, Dictionary<string, object> dict) 
{ 
    return (User)dict["ID_" + id]; 
} 
+0

這是聰明的,應該工作。如果沒有硬編碼任何字符串? – DarthVader 2010-10-21 20:17:09

+0

@ user177883:然後,你最終會得到一個** Dictionary **這可能不值得。 – 2010-10-21 20:32:06

0

由於您將ID存儲在用戶對象中,因此不需要用戶 - > ID映射。

+0

是的,我可以存儲它。它就在那裏。 – DarthVader 2010-10-21 20:04:39

1

我不知道你的問題的描述是有道理的,原因如下:

鑑於你知道ID的User對象,如ID是用戶的屬性。因此,你爲什麼需要Dictionary<User, Id>?如果你有Dictionary<Id, User>,你可以得到給定ID的用戶,如果你有用戶,你應該已經有了ID,這樣就不需要其他字典了。

或者有時你有一個不完整的用戶對象,並且沒有填充ID?

+0

在某些時候,我知道用戶(姓名和電子郵件),但不知道用戶名,並且在某些時候我知道用戶名,但不知道用戶名和電子郵件地址。說得通? – DarthVader 2010-10-21 20:09:53

+0

在這種情況下,它聽起來像你需要兩個字典:一個在電子郵件上進行查找(如果電子郵件不是唯一的,則連接該名稱),另一個在Id上查找。您不需要(或可能需要開銷)將整個用戶對象用作關鍵字。我傾向於只使用兩本字典:簡單而乾淨。您可以避免使用可以表示電子郵件或ID的密鑰類型在字典中存儲兩次相同的對象,但我不明白您購買了什麼。 – mtreit 2010-10-21 20:45:23

0

您可以輕鬆地創建兩個字典,因爲無論如何都通過引用存儲條目。但正如其他人所說,如果您擁有包含該用戶名的用戶,則像您一樣的接線永遠不需要找到該用戶名。

+0

是的,這很容易。我想我不能得到它與自定義比較.. – DarthVader 2010-10-21 20:10:22

0

我知道這個問題是舊的,但它提出了在谷歌搜索我只是做了,我很不滿意最多的回答。我會建議使用Tuple作爲字典中的關鍵字。如果姓名和電子郵件都是字符串,id是一個整數,那麼它可能是一個元組

+1

你的答案應該包括示例代碼。 – 2014-09-22 17:04:05