使用 LINQ 选择 Dictionary<T1, T2>
Posted
技术标签:
【中文标题】使用 LINQ 选择 Dictionary<T1, T2>【英文标题】:Select a Dictionary<T1, T2> with LINQ 【发布时间】:2009-03-06 00:20:24 【问题描述】:我使用“select”关键字和扩展方法通过 LINQ 返回 IEnumerable<T>
,但我需要返回通用 Dictionary<T1, T2>
并且无法弄清楚。我从中学到的示例使用了类似于以下形式的内容:
IEnumerable<T> coll = from x in y
select new SomeClass prop1 = value1, prop2 = value2 ;
我也对扩展方法做了同样的事情。我假设由于Dictionary<T1, T2>
中的项目可以迭代为KeyValuePair<T1, T2>
,我可以将上面示例中的“SomeClass”替换为“new KeyValuePair<T1, T2> ...
”,但这不起作用(键和值被标记为只读的,所以我无法编译这段代码)。
这可能吗,还是我需要分多个步骤执行此操作?
谢谢。
【问题讨论】:
【参考方案1】:扩展方法还提供ToDictionary 扩展。使用起来相当简单,一般的用法是为键传递一个 lambda 选择器并将对象作为值,但是您可以为键和值都传递一个 lambda 选择器。
class SomeObject
public int ID get; set;
public string Name get; set;
SomeObject[] objects = new SomeObject[]
new SomeObject ID = 1, Name = "Hello" ,
new SomeObject ID = 2, Name = "World"
;
Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name);
那么objectDictionary[1]
将包含值“Hello”
【讨论】:
【参考方案2】:更明确的选择是将集合投影到 KeyValuePair
的 IEnumerable,然后将其转换为字典。
Dictionary<int, string> dictionary = objects
.Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
.ToDictionary(x=>x.Key, x=>x.Value);
【讨论】:
是否可以删除 .ToDictionary(x=>x.Key, x=>x.Value);并用新的字典替换新的 KeyValuePair ?【参考方案3】:var dictionary = (from x in y
select new SomeClass
prop1 = value1,
prop2 = value2
).ToDictionary(item => item.prop1);
假设SomeClass.prop1
是字典所需的Key
。
【讨论】:
.ToDictionary(item => item.prop1, item => item.prop2);
也明确设置值。以上是关于使用 LINQ 选择 Dictionary<T1, T2>的主要内容,如果未能解决你的问题,请参考以下文章
LINQ 查询返回 Dictionary<string, string>
为啥 Dictionary<TKey, TValue> 上的这个 Linq 查询不能作为数据源工作
Linq to Dictionary<string, List<string>> 与 Null 值
C#里使用linq做多个值的GroupBy操作,被操作对象类型为List<Dictionary<string, string>> datas