0

我有两个列表。一个带有新对象,我们称之为 NewCol,另一个是我从数据库中读取的(我们称之为 CurrentCol)。CurrentCol 大约有 120 万行(并且会每天增长),而 NewCol 可以是任何东西,一次可以是 1 到数千行。任何人都可以帮我改进以下代码,因为它运行得太慢了:

foreach (PortedNumberCollection element in NewCol)
{
    if (CurrentCol.AsParallel().Select(x => x.MSISDN).Contains(element.MSISDN))
    {
        CurrentCol.AsParallel().Where(y => y.MSISDN == element.MSISDN)
            .Select
                (x =>
                    {      
                       //if the MSISDN exists in both the old and new collection
                       // then update the old collection                                              
                       x.RouteAction = element.RouteAction;
                       x.RoutingLabel = element.RoutingLabel;
                       return x;
                    }
                 );
    }
    else
    {
        //The item does not exist in the old collection so add it
        CurrentCol.Add(element);
    }
}
4

1 回答 1

3

将整个数据库读入内存并在那里搜索是一个非常糟糕的主意。搜索是数据库优化的目标。您可以做的最好的事情是以某种方式将整个代码移动到数据库中,例如通过对NewCol.


但是,如果您不能这样做,那么下一个最好的方法是制作一个以作为键CurrentCol的字典:MSISDN

// Somewhere... Only once, not every time you want to add new items
// In fact, there shouldn't be any CurrentCol, only the dictionary.
var currentItems = CurrentCol.ToDictionary(x => x.MSISDN, x => x);

// ...

foreach(var newItem in NewCol)
{
    PortedNumberCollection existingItem;
    if(currentItems.TryGetValue(newItem.MSISDN, out existingItem)
    {
        existingItem.RouteAction = newItem.RouteAction;
        existingItem.RoutingLabel = newItem.RoutingLabel;
    }
    else
    {
        currentItems.Add(newItem.MSISDN, newItem);
    }
}
于 2013-09-09T08:03:13.580 回答