3

共通のプロパティを持つこれらのビジネス オブジェクトがあるとします。

public class A
{
    // Properties in common
    public int Common { get; set; }
    public string aValue { get; set; }
    // Some other goes here.
}

public class B
{
    // Properties in common
    public int Common { get; set; }
    public string bValue { get; set; }

    // Some other goes here.
}

ビジネス ロジックには、次のような 2 つのリストがあります。

List<A> aList = new List<A>();
List<B> bList = new List<B>();

(そして、それぞれのリストに少なくとも 100 個のインスタンスが入力されていると仮定します) OK、問題を始めましょう。bList 内の各インスタンスの 1 つのプロパティを設定するために、aList を反復処理する必要があります。次のような共通のプロパティ:

foreach (A a in aList)
{
    B b = bList.Find(x => x.Common == a.Common);
    if (b != null)
        b.bValue = a.aValue;
}

アプリの完了に時間がかかりすぎるため、この操作を改善するより良い方法を知っている人はいますか?

ありがとう、

4

4 に答える 4

4

Findリストは線形であるため、これはうまく機能しません。結果のアルゴリズムはO(n^2)です。

Dictionary共通属性のからを作成し、bListで検索する代わりにキーで検索する必要がFindあります。辞書検索はO(1)償却されるため、リストの長さでアルゴリズムが線形になります。

var dict = bList.ToDictionary(b => b.Common);
foreach (A a in aList) {
    B b;
    if (dict.TryGetValue(a.Common, out b) {
        b.bValue = a.aValue;
    }
}
于 2012-04-18T00:39:44.750 に答える
2

特定のキーを指定して値を効率的に検索するには、リストではなく辞書を使用します。リスト内の特定の項目を見つけるには O(N) かかり、辞書では O(1) かかります。

Dictionary<int, B> bDict = new Dictionary<int, B>();
foreach (B b in bList) bDict.Add(b.Common, b);

foreach (A a in aList) {
  if (bDict.ContainsKey(a.Common)) 
    bDict[a.Common].bValue = a.aValue;
}
于 2012-04-18T00:42:02.270 に答える
1

linqで結合すると、2つのリストでハッシュ結合が行われるため、他の回答で提案されているように手動で辞書を作成する必要がなくなります。このマシンには、サンプルを作成するためのスタジオがありません。後で更新しようとします。

アイテムの数が非常に少ない場合、Linq はハッシュ結合を起動しないほど十分にスマートな場合もあります。

編集:次のようなものを試してください:

var joined = from a in aList
                    join b in bList on a.Common equals b.Common
                    select new {
                            A = a,
                            B = b
                    };

            foreach (var item in joined)
            {
                    item.B.bValue = item.A.aValue;
            }
于 2012-04-18T00:47:53.473 に答える
1

Common をキーとして bList を辞書タイプのコンテナーにコピーし、ループで bList 自体ではなくそれを使用します。

于 2012-04-18T00:38:35.663 に答える