【问题标题】:How to use a dictionary property in C# using LINQ如何使用 LINQ 在 C# 中使用字典属性
【发布时间】:2010-10-11 15:56:08
【问题描述】:

虽然我知道如何获取; & 放;使用简单类型(例如字符串)现在可以获取或设置更多属性(例如 Dictionary)还是可以吗?

我有一个小型 dos 程序试图做到这一点。 sn-p 下面。

# 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]

}

【问题讨论】:

标签: c# linq properties


【解决方案1】:

您需要首先在用户类的构造函数中初始化字典。使用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,因此可能会出现一些错误。

【讨论】:

  • 这是正确的想法。我唯一要补充的是,如果只有一个字典,或者其中一个显然是主字典,那么将其包装在索引器中可能会受益于此类。
  • 我做了您建议的更改,但可惜添加了“ UserDict.Add(UserRecord[5],UserRecord[9]);”调用代码似乎无效,并且不会编译。
  • 使用 Etienne de Martel 版本的行 UserDict = new Dictionary&lt;string, string&gt; { { UserRecord[5], UserRecord[9] } } 并去掉我添加的构造函数,这应该可以工作,但我认为它不会给你想要的结果。
【解决方案2】:

你可以使用集合初始化器来创建字典:

{
    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

【讨论】:

  • 这没有错,但它可能不适合您的需求。我希望您想要获取和设置字典值,而不是用新字典替换字典。有关如何做到这一点,请参阅 Scott Chamberlain 的回答。
猜你喜欢
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2014-08-01
相关资源
最近更新 更多