2013-06-18 14 views
5

A scopo illustrativo Ho una semplice classe Employee con diversi campi e un metodo per rimuovere più occorrenze nel Certifications proprietàOttenere valori unici da un elenco di oggetti con una lista <string> come una proprietà

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

Il metodo RemoveDuplicates funzionerà rimuovendo eventuali stringhe duplicate nella proprietà Certifications dell'oggetto Employee. Considerare ora se ho una lista di oggetti Employee.

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); 

ho potuto utilizzare

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

per ottenere un elenco di tutte le certificazioni uniche, da tutti i dipendenti nella lista, ma mi piacerebbe farlo in LINQ, qualcosa di simile a

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

mi dà un errore dicendo

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?) 

Come posso ottenere un elenco di certificazioni univoche da un elenco di oggetti Impiegato?

+1

Se EmployeeId è un identificativo univoco, si consiglia di eseguire l'override di GetHashCode e Equals utilizzando EmployeeId. Rendi anche le certificazioni List un HashSet (non List) per non consentire duplicati in Employee. – Paparazzi

+0

Questo è solo a scopo illustrativo, ma grazie per averlo indicato, lo archivierò nel set di strumenti. – wootscootinboogie

risposta

18

Se ho capito, volete un elenco di tutte le certificazioni uniche tra tutti i dipendenti. Questo sarebbe un lavoro per SelectMany:

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

Sapevo che dovevo essere vicino, e che era un solo rivestimento :) – wootscootinboogie

3

Si desidera utilizzare SelectMany, che consente di selezionare sottoliste, ma li restituisce in una forma appiattita:

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

Si può provare a utilizzare l'estensione SelectMany?

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