【问题标题】:Efficient way of updating a collection from another collection从另一个集合更新集合的有效方法
【发布时间】:2011-08-10 11:11:24
【问题描述】:

以下从另一个更新 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 是主键。
(在足够好我的意思是快速和高效)。

【问题讨论】:

  • 是否需要将 collection2 中的新项目添加到 collection1 中?删除不在集合 2 中但在集合 1 中的项目怎么办?这些使解决方案有点复杂,但并不难。
  • @CMP 谢谢。是的,最后我需要做你提到的所有事情。只是想让示例更简单,以了解方法的本质。

标签: c# .net linq collections observablecollection


【解决方案1】:

作为补充答案,您可以使用反射将 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,等等.)

【讨论】:

  • 是的。并且应该以智慧使用。如果他正在复制 10000 个对象,那是难以察觉的(多 1-2 毫秒)。对于 1000,大约需要 30-40 毫秒。对于 10.000、300-350 毫秒以上,眉毛会扬起。它只会在 100.000 以上开始发臭。所以,谨慎使用。 Obs.:来自基准应用程序的数据。
【解决方案2】:
   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;

如果 myItemc 是不同的类型,请查看 AutoMapper。

【讨论】:

  • 看起来好多了,并且通过不为每个属性查找项目而节省了很多。 null 检查还避免了潜在的崩溃错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多