使用List 作为属性从对象列表中获取唯一值

为了便于说明,我有一个简单的Employee类,其中包含几个字段和一个删除Certifications属性中多次出现的方法

 public int EmployeeId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } private List certifications = new List(); public List Certifications { get { return certifications; } set { certifications = value; } } public List RemoveDuplicates(List s) { List dupesRemoved = s.Distinct().ToList(); foreach(string str in dupesRemoved) Console.WriteLine(str); return dupesRemoved; } 

RemoveDuplicates方法将删除Employee对象的Certifications属性中的任何重复字符串。 现在考虑我是否有一个Employee对象列表。

  Employee e = new Employee(); List stringList = new List(); stringList.Add("first"); stringList.Add("second"); stringList.Add("third"); stringList.Add("first"); e.Certifications = stringList; // e.Certifications = e.RemoveDuplicates(e.Certifications); works fine Employee e2 = new Employee(); e2.Certifications.Add("fourth"); e2.Certifications.Add("fifth"); e2.Certifications.Add("fifth"); e2.Certifications.Add("sixth"); List empList = new List(); empList.Add(e); empList.Add(e2); 

我可以用

 foreach (Employee emp in empList) { emp.Certifications = emp.RemoveDuplicates(emp.Certifications); } 

获取列表中所有员工的所有唯一认证列表,但我想在LINQ中执行此操作,类似于

 stringList = empList.Select(emp => emp.Certifications.Distinct().ToList()); 

这给了我一个错误的说法

 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Collections.Generic.List>' to 'System.Collections.Generic.List'. An explicit conversion exists (are you missing a cast?) 

如何从Employee对象列表中获取唯一认证列表?

如果我理解,您需要列出所有员工中的所有独特认证。 这将是SelectMany的工作:

 var uniqueCerts = empList.SelectMany(e => e.Certifications).Distinct().ToList(); 

您想使用SelectMany,它允许您选择子列表,但以平面forms返回它们:

 stringList = empList.SelectMany(emp => emp.Certifications).Distinct().ToList(); 

您可以尝试使用SelectMany扩展程序吗?

 var employeeCertifications = (from e in employeeList select e.Certifications).SelectMany(x => x).Distinct();