Как совместить два списка с разным типом? - PullRequest
0 голосов
/ 13 марта 2020

У меня есть два списка, один список идентификаторов 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"}};

Теперь я хочу заполнить идентификатор для каждого человека из списка идентификаторов.

Есть ли способ сделать это в linq?

Ответы [ 2 ]

4 голосов
/ 13 марта 2020

Есть много способов сделать это .. Предполагая, что ваши списки имеют одинаковую длину

для l oop

for (int i = 0; i < persons.Count; i++)
   persons[i].Id = ids[i];

foreach L oop

var index = 0;
foreach (var person in persons)
   person.Id = ids[index++];

Метод расширения ForEach

var index = 0;
persons.ForEach(person => person.Id = ids[index++]);

Очередь

var queue = new Queue<int>(ids);
foreach (var person in persons)
   person.Id = queue.Dequeue();

Примечание Linq (Language Integrated Query) предназначен для запросов, а не для обновления свойств, поэтому я вообще не рекомендую подход 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();

Zip с побочными эффектами

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

Выбрать с побочными эффектами

persons.Select((person, i) => person.Id = i).ToList();
// or
var persons = persons.Select((person, i) => { person.Id = i; return person; }).ToList();

добавить еще много здесь

1 голос
/ 13 марта 2020

Select перегрузка с индексом в качестве второго аргумента и без побочных эффектов;)

var personsWithId = persons
    .Select((person, id) => new Person
    {
        Id = id,
        Name = person.Name
    })
    .ToList();

Если у вас есть предопределенный список идентификаторов и вы хотите применить идентификатор к человеку с таким же индексом из списка персон

Zip без побочных эффектов;)

var personIds = new[] { 1, 3, 5, 7, 9 };
var personsWithId = persons
    .Zip(personIds, (person, id) => new Person
    {
        Id = id,
        Name = person.Name
    })
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...