2011-04-21 3 views
1

Является ли следующий способ обновления ObservableCollection из другого (оба основаны на одном классе) достаточно хороши или лучше сделать другим способом (или просто улучшить)?Эффективный способ обновления коллекции из другой коллекции

foreach (MyEntity c in collection2) 
    { 
     collection1.Where(p => p.EntID == c.EntID).FirstOrDefault().Field1 = c.Field1; 
     collection1.Where(p => p.EntID == c.EntID).FirstOrDefault().Field2 = c.Field2; 
     ... 
     collection1.Where(p => p.EntID == c.EntID).FirstOrDefault().FieldN = c.FieldN;   
    } 

EntID является основным ключом.
(В хорошем состоянии я имею в виду быстрый и эффективный).

+0

Вам нужно добавить новые элементы в collection2 to collection1? Как насчет удаления элементов, которые не находятся в коллекции 2, но находятся в коллекции1? Это немного усложняет решение, но это не так сложно. – captncraig

+0

@CMP Спасибо. Да, в конце концов мне нужно сделать все, что вы упомянули. Просто хотел сделать пример проще, чтобы понять суть подхода. – rem

ответ

3
var myItem = collection1.Where(p => p.EntID == c.EntID).FirstOrDefault(); 
    if (myItem == null) 
     continue; 
    myItem.Field1 = c.Field1; 
    myItem.Field2 = c.Field2; 
    ... 
    myItem.FieldN = c.FieldN; 

Если myItem и c различные типы, посмотрите на AutoMapper.

+0

Выглядит гораздо приятнее и экономит немного, не глядя на элемент для каждой собственности. Нулевая проверка также позволяет избежать возможной ошибки при сбое. – captncraig

2

В качестве дополнительного ответа вы можете использовать отражение для копирования N полей из одного объекта в другой. Я уже говорил об этом здесь: How to refactor this?.

Вы можете иметь свой класс (SomeClass) реализовать этот код (оба объекта и тот же класс):

public void CopyPropertiesFrom(SomeClass SourceInstance) 
{ 
    foreach (PropertyInfo prop in typeof(SomeClass).GetProperties()) 
     prop.SetValue(this, prop.GetValue(SourceInstance, null), null); 
} 

Таким образом, если ваш класс имеет новые свойства, вам не придется беспокоиться обновив код, он уже есть!

Для объектов с разным классом это также можно сделать путем отражения от имени свойства, но есть некоторые предположения, которые вы должны сделать (что, если свойство не существует, какое свойство имеет другой тип, значение свойства равно null, и т. д.)

+0

Ew. Отражение стоит дорого. –

+0

Да, это так. И следует использовать с мудростью. Если он копирует 100 сотен объектов, это незаметно (на 1-2 мс). Для 1000, занимает около 30-40 мс больше. За 10.000, 300-350 мс больше, брови поднимаются. Он только начинает плыть выше 100.000. Итак, используйте осторожно. Обс .: Данные из контрольного приложения. –

Смежные вопросы