#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