如何组合两个不同类型的列表?

Chi*_*mar 0 .net c# .net-core

我有两个列表,一个是 ids 列表 List<int> ids = new List<int> { 1, 2, 3,4, 5};

另一个包含数据 Person 类的列表有两个属性 Id 和 Name

List<Person> persons= new List<Person> { new Person { Name = "test1"},  new Person { Name = "test2"},  new Person { Name = "test3"}, new Person { Name = "test4"},  new Person { Name = "test5"}};
Run Code Online (Sandbox Code Playgroud)

现在我想从 id 列表中为每个人填充 id。

有没有办法在 linq 中做到这一点?

AAA*_*ddd 5

有很多方法可以做到这一点..假设你的列表长度相同

for循环

for (int i = 0; i < persons.Count; i++)
   persons[i].Id = ids[i];
Run Code Online (Sandbox Code Playgroud)

foreach 循环

var index = 0;
foreach (var person in persons)
   person.Id = ids[index++];
Run Code Online (Sandbox Code Playgroud)

ForEach 扩展方法

var index = 0;
persons.ForEach(person => person.Id = ids[index++]);
Run Code Online (Sandbox Code Playgroud)

队列

var queue = new Queue<int>(ids);
foreach (var person in persons)
   person.Id = queue.Dequeue();
Run Code Online (Sandbox Code Playgroud)

注意 Linq(语言集成查询)用于查询而不是更新属性,所以我根本不推荐linq方法。但我是谁来判断...

Enumerable.Range 有副作用

Enumerable.Range(0, persons.Count).Select(i => persons[i].Id = ids[i]).ToList();
// or
var persons = Enumerable.Range(0, persons.Count).Select(i => { persons[i].Id = ids[i]; return persons[i]; }).ToList();
Run Code Online (Sandbox Code Playgroud)

有副作用的拉链

ids.Zip(persons, (i, person) => person.Id = i).ToList();
// or
var persons = ids.Zip(persons, (i, person) => { person.Id = i; return person; }).ToList();
// or still very iffy
ids.Zip(persons, (i, person) => (i: i, person: person))
   .ToList()
   .ForEach(x => x.person.Id = x.i);
Run Code Online (Sandbox Code Playgroud)

选择 有副作用

persons.Select((person, i) => person.Id = i).ToList();
// or
var persons = persons.Select((person, i) => { person.Id = i; return person; }).ToList();
Run Code Online (Sandbox Code Playgroud)

在这里添加更多