2016-02-02 35 views
0

下面的下面的代碼就可以顯示SelectSelectMany運營商之間的差異。使用的SelectMany

有什麼辦法來避免常見的技能呢?例如,如果兩名員工具有C#技能,那麼我只想打印一次。

namespace LinqOperators 
{ 
    class Employee 
    { 
     public string Name { get; set; } 
     public List<string> Skills { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Employee> employees = new List<Employee>(); 
      Employee emp1 = new Employee { Name = "Deepak", Skills = new List<string> { "C", "C++", "Java" } };//Adding Skills List to Employee List i.e List of List 
      Employee emp2 = new Employee { Name = "Karan", Skills = new List<string> { "SQL Server", "C#", "ASP.NET" } }; 

      Employee emp3 = new Employee { Name = "Lalit", Skills = new List<string> { "C#", "ASP.NET MVC", "Windows Azure", "SQL Server" } }; 

      employees.Add(emp1); 
      employees.Add(emp2); 
      employees.Add(emp3); 

      // Query using Select() 
      IEnumerable<List<String>> resultSelect = employees.Select(e => e.Skills); 

      Console.WriteLine("**************** Select ******************"); 

      // Two foreach loops are required to iterate through the results 
      // because the query returns a collection of arrays. 
      foreach (List<String> skillList in resultSelect) 
      { 
       foreach (string skill in skillList) 
       { 
        Console.WriteLine(skill); 
       } 
       Console.WriteLine();//To differntiate Two Skill Lists 
      } 

      // Query using SelectMany() 
      IEnumerable<string> resultSelectMany = employees.SelectMany(emp => emp.Skills); 

      Console.WriteLine("**************** SelectMany ******************"); 

      // Only one foreach loop is required to iterate through the results 
      // since query returns a one-dimensional collection. 
      foreach (string skill in resultSelectMany) 
      { 
       Console.WriteLine(skill); 
      } 

      Console.ReadKey(); 
     } 
    } 

} 

回答

4

SelectMany將彙整IEnumerable這樣就不會產生IEnumerable of IEnumerablesIEnumerable

IEnumerable<IEnumerable<string>> skills; //not this [[C#, Java], [C, C++, Java, C#]] 
IEnumerable<string> skills; //but this [C#, Java, C, C++, Java, C#] 

你可以使用DistinctresultSelectMany得到普遍的技能只有一次。

resultSelectMany = resultSelectMany.Distinct(); //[C#, Java, C, C++] 

或者把它放在同一行:

// Query using SelectMany() 
IEnumerable<string> resultSelectMany = employees.SelectMany(emp => emp.Skills).Distinct(); 
1

您可以使用.Distinct()刪除重複

+3

諷刺的是有3個相同的答案,都必須使用DISTINCT() –

+1

我正想折騰使用「Set 」的想法可能會獲得某種性能增強。幸運的是,我事先檢查了'Distinct()'的實現。 *令人震驚的是,它使用了「Set」。 ;) – jdphenix