假设我有几个对象列表,需要联合/交叉它们。目前我只是这样做:
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来使这些操作看起来要慢得多。
答案 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);
}