如何在LINQ中以更简洁的方式编写此示例?

时间:2017-06-26 19:02:48

标签: c# linq

来自此列表

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);
  }
}

2 个答案:

答案 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的属性,这是您要用作词典键的属性。如果不是这样,你应该相应地改变它。

基本上,我们根据listName中找到的项目进行分组,然后将结果投影到两个属性的匿名类型NameFoo ,显然与你想要的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);