2013-01-24 65 views
4
class Program 
{ 
    static void Main(string[] args) 
    { 
     List<EmployeeLocalRegister> lclEmployees = new List<EmployeeLocalRegister>() { 
      new EmployeeLocalRegister(){Name = "A", Phone= "A1"}, 
      new EmployeeLocalRegister(){Name = "B", Phone= "B1"}, 
      new EmployeeLocalRegister(){Name = "A", Phone= "A2"}, 
      new EmployeeLocalRegister(){Name = "B", Phone= "B2"}, 
      new EmployeeLocalRegister(){Name = "B", Phone= "B3"}, 
      new EmployeeLocalRegister(){Name = "C", Phone= "C1"}}; 

     List<EmployeeTelDir> telDir = new List<EmployeeTelDir>(); 

     var queryEmployeeLocalRegisterByName = 
     from empl in lclEmployees 
     group empl by empl.Name; 

     foreach (var employeeGroup in queryEmployeeLocalRegisterByName) 
     { 
      Console.WriteLine(employeeGroup.Key); 
      List<string> phone = new List<string>(); 
      foreach (EmployeeLocalRegister employee in employeeGroup) 
      { 

       Console.WriteLine(" {0}", employee.Phone); 
       phone.Add(employee.Phone); 
      } 

      telDir.Add(new EmployeeTelDir() { Name = employeeGroup.Key, Phone = phone }); 
     } 

     Console.ReadKey(); 
    } 
} 

public class EmployeeLocalRegister 
{ 
    public string Name; 
    public string Phone; 
} 

public class EmployeeTelDir 
{ 
    public string Name; 
    public List<string> Phone; 
} 

}使用LINQ進行分組

我使用上面的代碼轉換List<EmployeeLocalRegister>List<EmployeeTelDir>。這是唯一的優化方式嗎?

我可以使用Linq查詢來編寫更簡單的代碼,用於從List<EmployeeLocalRegister>List<EmployeeTelDir>的反向轉換,反之亦然?

回答

2

如果您不需要Console.WriteLine(...)你的代碼可以總結與LINQ:

List<EmployeeTelDir> telDir = (from empl in lclEmployees 
           group empl by empl.Name into employeeGroup 
           select new EmployeeTelDir 
           { 
            Name = employeeGroup.Key, 
            Phone = (from employee in employeeGroup 
              select employee.Phone).ToList() // The ToList() is the Holy Grail of the LINQ queries 
           }).ToList(); 

對於反向操作:

List<EmployeeLocalRegister> inverse = (from employeeTelDir in telDir 
             from phone in employeeTelDir.Phone // Doing 2 from ... in ... successively corresponds to the SelectMany() LINQ method 
             select new EmployeeLocalRegister 
             { 
              Name = employeeTelDir.Name, 
              Phone = phone 
             }).ToList(); 
+1

十分感謝!它像一個魅力 – user2008270

+2

在這種情況下,不要忘記接受;) –

0

拉姆達方式:

var telDir = lclEmployees.GroupBy(e => e.Name, 
            (n, p) => new EmployeeTelDir 
              { 
               Name = n, 
               Phone = p.Select(k => k.Phone).ToList() 
              }).ToList();