我有一个表单,其中包含一次全部更新的对象列表。在控制器中,嵌套循环将每个模型与其他模型进行比较,以便确定哪些对象已更新,哪些对象是新的。
foreach(var x in formObject)
{
foreach(var y in dbObject)
{
if(x.id == y.id)
{
//compare each property and notify user of change if different
}
}
}
考虑到大量对象以及服务器的速度,这需要花费大量时间。
这样做有更好的做法吗?在循环所有对象之前确定哪些对象已更新的某种方法?还是一个更有效的循环?
答案 0 :(得分:2)
您可以在Linq中使用联接:
var differences =
from x in formObject
join y in dbObject on x.id equals y.id
where ( /* compare each property */ )
select new { /* what do you want to tell the user */ };
当然,如果没有关于循环内容的更多信息,那就是我能提供的所有代码。
用流利的语法:
var differences =
formObject.Join(dbObject, x => x.id, y => y.id, (x, y) => new { x, y })
.Where(p => /* compare properties of p.x and p.y */)
.Select(p => new { /* what do you want to tell the user */ });
答案 1 :(得分:1)
您可以使用id作为键将所有dbObject放入字典中。然后你可以只查找字典中的每个对象,而不必遍历所有对象:
var dbObjects = new Dictionary<int, ObjectModel>();
foreach(var y in dbObject)
{
dbObjects.Add(y.id, y);
}
foreach(var x in formObject)
{
ObjectModel y;
if(dbObjects.TryGetValue(x.id, out y))
{
//compare each property and notify user of change if different
}
}