快速联合并在.net中相交

时间:2012-01-17 07:15:48

标签: .net set

假设我有几个对象列表,需要联合/交叉它们。目前我只是这样做:

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(); 

我相信这工作非常慢,即使列表按其中一个字段排序。我怎样才能让它更快? Hashsets,树木等?最好由.NET 4提供。

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

1 个答案:

答案 0 :(得分: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);
}