Добавить атрибут из одного списка в другой список с тем же идентификатором

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

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

Спасибо за вашу помощь.

 /*Parameters*/
List < Model1 > List1, <Model2 > List2

List < Model1 > newList = new List < Model1 > ();

foreach(Model1 list1 in List1) {
  foreach(Model2 list2 in List2) {
    if (list1.ID == list2.ID) {
      list1.Attribute = list2.Attribute;
    }
  }
  newList.Add(list1);
}
return newList;
  

Ответ №1:

Если вы просто пытаетесь скопировать атрибут к тем же элементам из list1

 public static void CopyAttributesOfMatchingItems(List<Model1> list1, List<Model2> list2)
{
        foreach (var item in list1)
        {
            var matchingItem = list2.SingleOrDefault(i2 => i2.Id == item.Id);
            if (matchingItem != null)
                item.Attribute = matchingItem.Attribute;
// if Attribute is reference type, and you want an actual copy you will need to clone... item.Attribute = matchingItem.Attribute.Clone();
        }
}
  

Если вам нужно добавить элементы с соответствующими идентификаторами в новый список (поскольку вы упомянули в комментарии, что хотите использовать лямбда-выражение).

 public static List<Model1> CopyItemsToNewList(List<Model1> list1, List<Model2> list2)
{
        List<Model1> newList = new List<Model1>();
        newList.AddRange(list1.Where(i1 => list2.Any(i2 => i2.Id == i1.Id) ));
        return newList;
}
  

Примечание: Из вопроса не очень ясно, хотите ли вы добавить тот же объект в новый список или хотите, чтобы в новый список была добавлена фактическая копия объекта. В случае первого вы хорошо справляетесь с этим, в случае последнего вам нужно будет использовать метод для клонирования этого объекта и добавления клона в список..

Комментарии:

1. matchingItem — это работа в моем случае

Ответ №2:

Что не так с вашим кодом? Если он все равно уже заключен в метод, я не вижу проблемы с тем, что у вас есть. Я бы опубликовал комментарий вместо ответа, но для этого вам нужно больше репутации, чем мне.

Вы могли бы сделать это расширением, если это имеет смысл в вашем контексте

 //Put this in a static class
public static List<Model1> CopyAttributes(this List<Model1> list1, List<Model2> list2) {
    List<Model1> newlist = new List<Model1>();
    foreach(Model1 item1 in list1) {
        foreach(Model2 item2 in list2) {
            if(item1.ID == item2.ID) {
                item1.Attribute = item2.Attribute;
            }
        }
        newlist.Add(item1);
    }
    return newlist;
}
  

РЕДАКТИРОВАТЬ: Вот решение LINQ, использующее лямбды, как вы просили; Этот код не является лучшей практикой, но это то, о чем вы, похоже, просите. Он также не намного меньше, просто потому, что то, что вы хотите, уникально для вашего случая и не может быть сильно обобщено.

 List<Model1> newlist = new List<Model1>();
list1.ForEach(item1 => {
    list2.ForEach(item2 => {
        if(item1.ID == item2.ID) item1.Attribute = item2.Attribute;
    });
    newlist.Add(item1);
});
  

Комментарии:

1. Я хотел бы знать, есть ли более чистый способ скопировать атрибут, возможно, с использованием лямбда-выражений, или вы думаете, что это лучший способ? спасибо за вашу помощь и пожелания.

2. Обновил мой ответ, надеюсь, это то, что вы ищете @Zero