Эффективный способ обновления коллекции из другой коллекции - PullRequest
1 голос
/ 21 апреля 2011

Достаточно ли хорош следующий способ обновления 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 является первичным ключом.
(под достаточно хорошим я имею в виду быстрый и эффективный).

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011
   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.

2 голосов
/ 21 апреля 2011

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

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

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

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

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

...