C# 列表<;信息>;其中“信息”的最后一个和第一个属性映射到字典<;最后,列出<;第一>&燃气轮机;
如果我有一个类型的类C# 列表<;信息>;其中“信息”的最后一个和第一个属性映射到字典<;最后,列出<;第一>&燃气轮机;,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,如果我有一个类型的类 class Info { public Info(string first, string last) { this.First = first; this.Last = last; } string First { get; private set; } string Last { get; private set; } } 以及一份清单,例如: var list = new List<Info>(); list.Add(new In
class Info
{
public Info(string first, string last) { this.First = first; this.Last = last; }
string First { get; private set; }
string Last { get; private set; }
}
以及一份清单,例如:
var list = new List<Info>();
list.Add(new Info("jon", "doe");
list.Add(new Info("jane", "doe");
list.Add(new Info("bason", "borne");
list.Add(new Info("billy", "nomates");
var list=newlist();
添加(新信息(“jon”、“doe”);
添加(新信息(“jane”、“doe”);
添加(新信息(“bason”、“Born”);
添加(新信息(“比利”、“游牧者”);
我想映射到一个排序的姓氏列表,以及一个姓氏列表,即字典
,其中键是姓氏属性,列表是姓氏属性的列表
在上面的例子中,我想得到{“doe”=>{“jon”,“jane”},“borne”=>{“jason”},“nomates”=>{“billy”}
是否可以使用Linq整齐地执行此操作?如果可以,我将如何执行此操作?您可以使用并完成此操作:
首先,将类中的属性公开,然后使用以下代码:
Dictionary<string, List<string>> names = list
.GroupBy(x => x.Last)
.ToDictionary(x => x.Key, x => x.Select(y => y.First).ToList());
字典名称=列表
.GroupBy(x=>x.Last)
.ToDictionary(x=>x.Key,x=>x.Select(y=>y.First).ToList());
对于这类数据,我通常更喜欢使用ILookup
。您可以这样构造它:
list.ToLookup(e => e.Last, e => e.First);
虽然从技术上讲,它并不像你要求的那样是一本词典
,但它仍然可以完成你可能想做的大部分事情
var firstNamesByLastName = list.ToLookup(e => e.Last, e => e.First);
foreach(var firstName in firstNamesByLastName["bourne"])
{
Console.WriteLine(firstName); // outputs "jason"
}
请注意,您无法更改ILookup
对象。因此,您无法在构建后添加新名称。但您希望使用LINQ构建它的事实告诉我,您几乎肯定不打算这样做
另一个主要的语义差异是,如果您查询ILookup
中不存在的内容,它将返回一个空集。同样,在这种情况下,我更喜欢这种行为
// if this used a dictionary, we'd get an exception.
foreach(var firstName in firstNamesByLastName["unborne"])
{
Console.WriteLine(firstName); // outputs "jason"
}
你提到你想要它排序,但是你的例子没有排序。字典是一个无序的集合。很好的发现-我不需要任何排序,只需要分组唯一的警告是查找是不可变的。