2010-10-11 60 views
1

雖然我的用戶如何獲得; &集;與簡單的類型,如字符串現在可以更多的屬性,如字典被獲取或設置或可以嗎?如何在使用LINQ的C#中使用字典屬性

我有一個小的DOS程序試圖做到這一點。下面的代碼段。

# User.cs 
namespace LDIFMod 
{ 
    public class User 
    { 

     public string UserHash { get; set; } 
     public string UserID { get; set; } 
     public Dictionary<string, string> UserDict { get; set; } <- how to do this??? 
} 

} 

,並在我的Program.cs

var query = from line in File.ReadAllLines(args[0]) 
let UserRecord = line.Split(',') 
select new User() 

{ 

UserHash = UserRecord[2].Trim() +UserRecord[3].Trim(), 
UserID = UserRecord[4].Trim(), 
UserDict.???? // userDict should contain key = UserRecord[5] & value = UserRecord[9] 

} 
+0

哦,它不是「DOS」,它是命令行。 – 2010-10-11 16:13:24

+0

@Thomas Levesque,我相信當問題被問到時他有0%。 – 2010-10-11 16:33:34

+0

@Canacourse對不起,你最近與我做了另一個答案。 – 2010-10-11 16:39:56

回答

4

你會需要首先在用戶類的構造函數中初始化字典。使用private set可防止人們重新初始化字典。

# User.cs 
namespace LDIFMod 
{ 
    public class User 
    { 
     User() 
     { 
      UserDict = new Dictionary<string, string>() 
     } 
     public string UserHash { get; set; } 
     public string UserID { get; set; } 
     public Dictionary<string, string> UserDict { get; private set; } 
    } 
} 

調用代碼變得

var query = from line in File.ReadAllLines(args[0]) 
let UserRecord = line.Split(',') 
select new User() 
{ 
    UserHash = UserRecord[2].Trim() +UserRecord[3].Trim(), 
    UserID = UserRecord[4].Trim(), 
    UserDict.Add(UserRecord[5],UserRecord[9]); 
} 

這將返回每個查詢行一個詞典。如果你想讓所有的行共享一本字典,你需要將其設置爲靜態或者不將其存儲在User中。如果你這樣做,請注意linq是延遲執行的,所以直到完全枚舉查詢之後字典纔會被完全填充。


我想我會給如何與他們做它在一個單一的字典中的例子。

# User.cs 
namespace LDIFMod 
{ 
    public class User 
    { 
     public string UserHash { get; set; } 
     public string UserID { get; set; } 
     public readonly string[] SourceData {get; private set;} 
    } 
} 

,這裏是查詢

var query = from line in File.ReadAllLines(args[0]) 
let UserRecord = line.Split(',') 
select new User() 
{ 
    UserHash = UserRecord[2].Trim() + UserRecord[3].Trim(), 
    UserID = UserRecord[4].Trim(), 
    SourceData = UserRecord; 
} 
var UserLookp = query.ToDictionary((user) => user.SourceData[5], (user) => user.SourceData[9]); 

這純粹是從內存中沒有一個IDE來檢查錯誤,從而可能會出現一些錯誤。

+0

這是正確的想法。我唯一要補充的是,如果只有一個字典或者其中一個字典顯然是主字典,那麼這個類可能會受益於將它包裝在索引器中。 – 2010-10-11 16:12:39

+0

我做了你建議的更改,但可惜添加「UserDict.Add(UserRecord [5],UserRecord [9]);」到調用代碼似乎不是有效的,它不會編譯。 – Canacourse 2010-10-11 19:33:22

+0

使用Etienne de Martel版本的UserDict = new Dictionary {{UserRecord [5],UserRecord [9]}}'並刪除我添加的構造函數,這應該可行,但我不'不要以爲它會給你你想要的結果。 – 2010-10-11 21:14:26

1

您可以使用集合初始創建詞典:

{ 
    UserHash = UserRecord[2].Trim() +UserRecord[3].Trim(), 
    UserID = UserRecord[4].Trim(), 
    UserDict = new Dictionary<string, string> { { UserRecord[5], UserRecord[9] } } 
} 

而且,在這裏看到:http://msdn.microsoft.com/en-us/library/bb531208.aspx

+0

這沒有錯,但它可能不適合您的需求。我希望你想獲得並設置字典值,而不是用新字典替換字典。見斯科特·張伯倫的答案是如何做到這一點。 – 2010-10-11 16:11:32

+0

確實。我也贊同他的回答。 – 2010-10-11 19:52:59