【发布时间】:2011-03-17 15:51:30
【问题描述】:
我想将修改后的记录数组与从数据库中提取的记录列表进行比较,并从数据库中删除传入数组中不存在的那些记录。修改后的数组来自维护数据库的客户端应用程序,并且此代码在 WCF 服务应用程序中运行,因此如果客户端从数组中删除记录,则应从数据库中删除该记录。这是示例代码sn-p:
public void UpdateRecords(Record[] recs)
{
// look for deleted records
foreach (Record rec in UnitOfWork.Records.ToList())
{
var copy = rec;
if (!recs.Contains(rec)) // use this one?
if (0 == recs.Count(p => p.Id == copy.Id)) // or this one?
{
// if not in the new collection, remove from database
Record deleted = UnitOfWork.Records.Single(p => p.Id == copy.Id);
UnitOfWork.Remove(deleted);
}
}
// rest of method code deleted
}
我的问题:与 Contains 方法相比,使用 Count 方法是否有速度优势(或其他优势)? Id 属性保证是唯一的并且可以识别该特定记录,因此您不需要像我认为 Contains 可能那样进行按位比较。
有人吗? 谢谢,戴夫
【问题讨论】:
-
为什么不设置一个测试应用程序调用每 10,000 次并对其进行基准测试?
-
好吧,理论上,您的 Count 方法正在做更多的工作 - Contains 会在找到匹配项时返回,您的计数将继续到最后。
-
简短的回答是,无论如何,任何网络延迟都会失去毫秒/微秒的优势。在我看来,将此归结为过早的优化。
-
另外请注意,除非这会导致性能问题 - 通常不值得为此担心,您应该选择更能表达您意图的方法,因此包含或任何。是的,其他人称之为 - 过早优化。
-
如果
Record是一个类,它不会进行按位比较。