Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表<;信息>;其中“信息”的最后一个和第一个属性映射到字典<;最后,列出<;第一>&燃气轮机;_C#_Linq_Linq To Objects - Fatal编程技术网

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"
}

你提到你想要它排序,但是你的例子没有排序。字典是一个无序的集合。很好的发现-我不需要任何排序,只需要分组唯一的警告是查找是不可变的。