7

2つをマージするコードの一部を高速化することを目指していSortedListsます。

C#4.0ジェネリック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);
}

ループの代わりにユニオンのforeach方が速いと思いますが、にユニオンを実装する方法がわかりませんSortedList。誰かがそれを手伝ってくれるなら、私はそれをいただければ幸いです。

また、これを全体的に行うためのより良い方法があれば、私は提案を受け入れます。

4

2 に答える 2

3

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

SortedList1つずつ追加するだけなので、辞書を作成する必要があります。したがって、他の唯一のオプションは、コンストラクターに辞書を挿入すること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);
于 2012-11-02T04:36:37.297 に答える
2

SortedSetには、要求していることを実行するUnionWithメソッドがあります。私はSortedSetの独自の実装を作成しましたが、それは非常に高速に実行されます。

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

気にしないでください、私はあなたの質問を読み直しました、そしてあなたはリスト実装を使用しています。ただし、特定のキーを使用する代わりにEqualityComparerを作成する方法を理解できる場合は、SortedSetを目的に適合させることができる場合があります。

于 2012-11-02T01:40:21.173 に答える