2010-10-11 33 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