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

Dav*_*vid 3 c# linq

来自这个清单

List<Foo> list = new List<Foo>()
{
  new Foo("Albert", 49, 8),
  new Foo("Barbara", 153, 45),
  new Foo("Albert", -23, 55)
};
Run Code Online (Sandbox Code Playgroud)

我想找到一个字典,其中名称为键,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);
  }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*tos 11

你可以尝试这样的事情:

var dictionary = list.GroupBy(f=>f.Name)
                     .Select(gr=>new { Name = gr.Key, Foo = gr.First() })
                     .ToDictionary(x=>x.Name, x=>x.Foo);
Run Code Online (Sandbox Code Playgroud)

我曾认为Foo有一个名为属性Name,这是你要为你的字典的关键在于使用的.如果不是这样,你应该相应地改变它.

从本质上讲,我们将list基于此的项目分组Name,然后将结果投影到两个属性的匿名类型,Name并且Foo显然与您想要的dictinary的键/值相关联,然后我们调用该ToDictionary方法.

更新

正如伊戈尔正确指出的那样,你可以通过使用的整个投影Select并立即调用ToDictionary

var dictionary = list.GroupBy(f=>f.Name)
                     .ToDictionary(gr=>gr.Key, gr=>gr.First());
Run Code Online (Sandbox Code Playgroud)