我有字符串列表
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" }
};
提前谢谢!
答案 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);
}
这是使用Zip
operator的另一个效率较低的版本(仅适用于.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();
您也可以使用Batch
operator中的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] });