代码之家  ›  专栏  ›  技术社区  ›  Andrew Florko

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

  •  2
  • Andrew Florko  · 技术社区  · 15 年前

    我有弦的表

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

    提前谢谢!

    2 回复  |  直到 15 年前
        1
  •  6
  •   Ani    15 年前

    如果您可以使用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),它使用 Zip operator :

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

    您也可以使用 Batch operator MoreLinq 在这里:

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

    如果你想让这种函数更通用一点(也许明天人们会取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] });