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

And*_*rko 2 c# instantiation

我有字符串列表

var data = new List<string> {"Name1", "Surname1", "Name2", "Surname2" };
Run Code Online (Sandbox Code Playgroud)

和描述Person的类

class Person
{
   public string Name { get; set; }
   public string Surname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

var persons = new List<Person>
{ 
    new Person { Name = "Name1", Surname = "Surname1" }, 
    new Person { Name = "Name2", Surname = "Surname2" }
};
Run Code Online (Sandbox Code Playgroud)

先感谢您!

Ani*_*Ani 6

如果你可以使用LINQ,这是一种方式:

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

您可以将其视为松散等效于:

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);
}
Run Code Online (Sandbox Code Playgroud)

这是使用Zip运算符的另一个效率较低的版本(仅适用于.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();
Run Code Online (Sandbox Code Playgroud)

你也可以使用Batch运营商MoreLinq这里:

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