比较大型对象列表

时间:2013-11-12 23:38:04

标签: c# asp.net-mvc-3

我有一个表单,其中包含一次全部更新的对象列表。在控制器中,嵌套循环将每个模型与其他模型进行比较,以便确定哪些对象已更新,哪些对象是新的。

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
        }
    }
}

考虑到大量对象以及服务器的速度,这需要花费大量时间。

这样做有更好的做法吗?在循环所有对象之前确定哪些对象已更新的某种方法?还是一个更有效的循环?

2 个答案:

答案 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
    }
}