2012-01-17 5 views
0

私はオブジェクトのいくつかのリストを持っており、それらを結合/交差させる必要があるとしましょう。現在、私は単純に、このような何かを:高速連合とネットで交差する

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

私は、これはリストがそれぞれの分野の一つでソートされているにもかかわらず、非常に遅く働いていると信じています。どうすれば速くすることができますか?ハッシュセットや木など?これらのオブジェクトは実際にはキャッシュされた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); 
}