2013-06-18 14 views
5

zu illustrativen Zwecken ich eine einfache Klasse Employee mit mehreren Feldern und ein Verfahren habe mehrere Vorkommen in der Certifications Eigenschaft entfernenErste eindeutige Werte aus einer Liste von Objekten mit einer Liste <string> als Eigenschaft

public int EmployeeId { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 

     private List<string> certifications = new List<string>(); 
     public List<string> Certifications 
     { 
      get { return certifications; } 
      set { certifications = value; } 
     } 

public List<string> RemoveDuplicates(List<string> s) 
     { 
      List<string> dupesRemoved = s.Distinct().ToList(); 
      foreach(string str in dupesRemoved) 
       Console.WriteLine(str); 
      return dupesRemoved; 
     } 

Die RemoveDuplicates-Methode wird funktionieren, doppelte Zeichenfolgen in der Certifications-Eigenschaft des Employee-Objekts zu entfernen. Überlegen Sie jetzt, ob ich eine Liste von Mitarbeiter-Objekten habe.

Employee e = new Employee(); 
      List<string> stringList = new List<string>(); 
      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<Employee> empList = new List<Employee>(); 
      empList.Add(e); 
      empList.Add(e2); 

konnte ich

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

verwenden, um eine Liste aller einzigartigen Zertifizierungen zu erhalten, von allen Mitarbeitern in der Liste, aber ich möchte dies in LINQ tun, so etwas wie

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

Dies gibt mir einen Fehler,

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

Wie kann ich eine Liste eindeutiger Zertifizierungen aus einer Liste von Employee-Objekten abrufen?

+1

Wenn EmployeeId ein eindeutiger Bezeichner ist, empfehle ich Ihnen, GetHashCode und Equals mit EmployeeId zu überschreiben. Machen Sie auch Liste Zertifizierungen ein HashSet (nicht Liste), um Duplikate in Mitarbeiter zu erlauben. – Paparazzi

+0

Dies dient nur zur Veranschaulichung, aber ich danke Ihnen für das Aufzeigen, dass ich dieses im Werkzeugsatz ablegen werde. – wootscootinboogie

Antwort

18

Wenn ich verstehe, Sie wollen eine Liste aller einzigartigen Zertifizierungen unter allen Mitarbeitern. Dies wäre ein Job für SelectMany sein:

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

Ich wusste, dass ich in der Nähe sein musste, und dass es ein One Liner war :) – wootscootinboogie

3

Sie wollen Select verwenden, die Sie Sublisten wählen, sondern gibt sie in einer abgeflachten Form lässt:

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

Sie können versuchen, mit Hilfe der Select Erweiterung?

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