2012-01-17 72 views
0

假设我有几个对象列表,并需要联合/相交它们。目前,我只是做这样的事情:快速联合并在.net中相交

List result = lists[0]; 
for(int i = 1; i < lists.Count; i++) 
    result = (op == 'and') ? result.Union(lists[i]).ToList() 
    : result.Intersect(lists[i]).ToList(); 

我相信这是工作非常缓慢,即使名单是各自领域中的一个分类。我会如何加快速度?哈希集合,树木等?由.NET 4提供。

这些对象实际上是缓存DataRows,因为依靠DB来使这些操作看起来要慢得多。

回答

2

那么使用HashSet<T>似乎是有道理的,是的 - 有没有点转换一切到列表来回,假设你真的不关心顺序:

var result = new HashSet<Foo>(lists[0]); 
foreach (var list in lists.Skip(1)) 
{ 
    if (op == "and") 
    { 
     result.UnionWith(list); 
    } 
    else 
    { 
     result.IntersectWith(list); 
    } 
} 

这是有几分丑陋那里的“如果”,介意。您可能需要:

var result = new HashSet<Foo>(lists[0]); 
Action<IEnumerable<Foo>> action = op == "and" 
    ? result.UnionWith : result.IntersectWith; 
foreach (var list in lists.Skip(1)) 
{ 
    action(list); 
}