从顺序数据填充属性时创建类实例的最短方法

时间:2010-11-24 13:33:03

标签: c# instantiation

我有字符串列表

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

和描述Person的类

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

提前谢谢!

2 个答案:

答案 0 :(得分: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);
}

这是使用Zipoperator的另一个效率较低的版本(仅适用于.NET 4.0):

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

您也可以使用Batchoperator中的MoreLinq

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

答案 1 :(得分:2)

如果你想让这种函数更通用一些(明天Person可能需要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] });