来自此列表
List<Foo> list = new List<Foo>()
{
new Foo("Albert", 49, 8),
new Foo("Barbara", 153, 45),
new Foo("Albert", -23, 55)
};
我想找到一个字典,其名称为key,第一个Foo
- 对象来自列表,其名称为该值。
有没有办法使用LINQ以比我在这里所做的更简洁的方式编写逻辑?
Dictionary<string, Foo> fooByName = new Dictionary<string, Foo>();
foreach (var a in assignmentIndetifiers)
{
if (!names.ContainsKey(a.ValueText))
{
names.Add(a.ValueText, a);
}
}
答案 0 :(得分:11)
您可以尝试这样的事情:
var dictionary = list.GroupBy(f=>f.Name)
.Select(gr=>new { Name = gr.Key, Foo = gr.First() })
.ToDictionary(x=>x.Name, x=>x.Foo);
我假设 Foo
有一个名为Name
的属性,这是您要用作词典键的属性。如果不是这样,你应该相应地改变它。
基本上,我们根据list
对Name
中找到的项目进行分组,然后将结果投影到两个属性的匿名类型Name
和Foo
,显然与你想要的dictinary的键/值相关联,然后我们调用ToDictionary
方法。
<强>更新强>
正如伊戈尔正确指出的那样,您可以使用Select
传递整个投影并立即调用ToDictionary
var dictionary = list.GroupBy(f=>f.Name)
.ToDictionary(gr=>gr.Key, gr=>gr.First());
答案 1 :(得分:0)
作为GroupBy()
的替代方案,您可以使用MoreLinq's DistinctBy()
(可通过NuGet获取):
var names = items.DistinctBy(x => x.ValueText).ToDictionary(x => x.ValueText);