2012-11-02 11 views
5

2つをマージするコードを高速化しようとしていますSortedLists。ジェネリックSortedListC#2つのSortedListsを結合する(Union?)

C#4.0:私は労働組合の代わりforeachループがより速くなるだろうと考えていますが、私はSortedList上の組合を実装する方法がわからないhttp://msdn.microsoft.com/en-us/library/ms132319(v=vs.100).aspx

public Trait getTrait(decimal thisValue) 
{  
    if (ParentStructure != null && ParentStructure.RankedTraits.Count > 0) 
    { 
     SortedList<decimal, Trait> tempTraits = this.RankedTraits; 

     // Improve here (union?) 
     foreach (KeyValuePair<decimal, Trait> kvp in (ParentStructure.RankedTraits)) 
     { 
      if (!tempTraits.ContainsKey(kvp.Key)) 
      { 
       tempTraits.Add(kvp.Key, kvp.Value); 
      } 
     } 
     return _getTrait(tempTraits, thisValue); 
     } 
    } 
    return _getTrait(_rankTraits, thisValue); 
} 

。誰かが私を助けてくれたら、私はそれを感謝します。

さらに、この全体的なやり方を改善する方法がある場合は、私は提案を公開しています。

+1

ちょっと考えましたが、[この回答](http://stackoverflow.com/a/1754080/551322)によれば、入力コレクションを並べ替えると役立ちます。 – nrodic

+0

ありがとう、ソートされたリストからデータが入力されているので、SortedDictionaryに切り替えることはできますが、それを見て、それを見分ける必要があります。 –

+0

なぜこのコードをスピードアップするのですか?それはパフォーマンスが悪いですか? – Enigmativity

答えて

2

2つのSortedListインスタンスをマージすると考えることができる唯一の方法は、それらを結合してからルックアップに変換してから、ルックアップコレクションの最初の要素を取得して辞書を作ることです。

SortedListは1つずつの追加だけをサポートするため、辞書を作成する必要があります。したがって、唯一の他の選択肢は、辞書をSortedListコンストラクタに挿入することです。

ボトムライン:あなたの現在のコードはそれなりの価値があると思います。 LINQはコードを約2行に減らすのに役立ちます(または、あなたがマゾヒストであれば1つ)。

SortedList<decimal, Traits> listA = new SortedList<decimal, Traits>(); 
SortedList<decimal, Traits> listB = new SortedList<decimal, Traits>(); 

listA.Add(1m, new Traits { FieldName = "One" }); 
listA.Add(2m, new Traits { FieldName = "Two" }); 
listA.Add(3m, new Traits { FieldName = "Three" }); 

listB.Add(1m, new Traits { FieldName = "One" }); 
listB.Add(4m, new Traits { FieldName = "Four" }); 
listB.Add(5m, new Traits { FieldName = "Five" }); 

var listUnion = listA.Union(listB).ToLookup(k => k.Key, v => v.Value) 
        .ToDictionary(k => k.Key, v => v.First()); 
var listMerged = new SortedList<decimal, Traits>(listUnion); 
+0

ありがとうございます - それは私の質問を答えていますが、私のコードをもっと速くするわけではありません(おそらくSortedListに戻す必要があるからです)。再度、感謝します! –

+0

ええ、私もそう思っています。問題は、 'SortedList.Union'が' IEqualityComparer'を尊重していないようです。もしそうであれば、ルックアップへの変換が辞書への後の変換に影響を与えるので、**より少しパフォーマンスが良いかもしれません。 'SortedList'は、一度に1つだけではなく、' KeyValuePairs'の範囲を追加することを本来的にサポートしていないことも驚いています。 – code4life

+0

これは、linqがバックグラウンドで行うことになるので、実際には元のコードよりも多くのループを繰り返します。 – theMayer

1

SortedSetには、求めていることを行うUnionWithメソッドがあります。私はSortedSetの独自の実装を作成し、非常に迅速に実行します。

http://msdn.microsoft.com/en-us/library/dd411939.aspx

ネヴァーマインド、I再読み込みあなたの質問をし、あなたがリストの実装を使用しています。ただし、特定のキーを使用する代わりにEqualityComparerを作成する方法を見つけ出すことができれば、SortedSetを目的に合わせることができます。

+0

ありがとうございますが、SortedSetとSortedListは同じものではありません。それは私を台無しにしているキー/値であり、ソートセットにはキーがありません。 - また、私はそれを実装する方法のいくつかの種類の例を得ることを望んでいます。私は自分で検索することができます。 –

+0

本当に、私の謝罪。しかし、サンプルコードを見て、重複を排除しようとしていますか? – theMayer

+0

重複キーがありません - とにかくSortedListが重複キーを持つことはできません。重複した値は問題ありません。 –

関連する問題