2010-11-24 34 views
2

我有一个字符串最短的方式,当属性从连续的数据

var data = new List<string> {"Name1", "Surname1", "Name2", "Surname2" }; 

和类的列表描述人

class Person 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 

填充什么是创建填充List<Person>最短的路data列表 结果应该等于

var persons = new List<Person> 
{ 
    new Person { Name = "Name1", Surname = "Surname1" }, 
    new Person { Name = "Name2", Surname = "Surname2" } 
}; 

预先感谢您!

回答

6

如果你可以使用LINQ,这里有一个方法:

var persons = Enumerable.Range(0, data.Count/2) 
         .Select(i => new Person 
              { 
              Name = data[2 * i], 
              Surname = data[2 * i + 1] 
              }) 
         .ToList(); 

你可以认为这是松散相当于:

var persons = new List<Person>(); 

for(int i = 0; i < data.Count/2 ; i++) 
{ 
    var person = new Person 
        { 
         Name = data[2 * i], 
         Surname = data[2 * i + 1] 
        }; 

    persons.Add(person); 
} 

下面是另一个,效率较低,版本(仅适用在.NET 4.0中)使用Zipoperator

var names = data.Where((s, i) => i % 2 == 0); 
var surnames = data.Where((s, i) => i % 2 == 1); 

var persons = names.Zip(surnames, 
         (name, surname) => new Person 
              { 
               Name = name, 
               Surname = surname 
              }) 
        .ToList(); 

您也可以使用BatchoperatorMoreLinq这里:

var persons = data.Batch(2) 
        .Select(pair => new Person 
             { 
             Name = pair.ElementAt(0), 
             Surname = pair.ElementAt(1) 
             }) 
        .ToList(); 
+1

这是一个很好的答案。我想更多的投票:) – Bryan 2010-11-24 13:41:54

2

如果你想使这种功能一点更通用的(也许明天人将采取3个值),您可以创建一个扩展方法返回的数据块:

public static List<List<T>> GetChunks<T>(this IList<T> list, int chunkSize) 
{ 
    return Enumerable 
       .Range(0, list.Count/chunkSize) 
       .Select(i => Enumerable 
        .Range(0, chunkSize) 
        .Select(j => list[i * chunkSize + j]) 
        .ToList()) 
       .ToList(); 
} 

那么在这种情况下,我们可以做到以下几点:

var people = data.GetChunks(2) 
    .Select(s => new Person() { Name = s[0], Surname = s[1] });