2016-02-02 2 views
0

Здесь, в нижеследующем коде, мы можем показать разницу между Select и оператором SelectMany.Использование 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 IEnumerables но IEnumerable:

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

Вы можете использовать Distinct в вашем resultSelectMany, чтобы получить общий навык только один раз.

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()». * Shockingly *, он использует 'Set'. ;) – jdphenix

Смежные вопросы