3

適切に並べられた ID の int 配列があります。次に、ID プロパティを持つ順序付けられていないオブジェクトの配列があります。

int 配列の順序と一致する ID でオブジェクトを並べたいと思います。

の線に沿った何か

newObjectArray = oldObjectArray.MatchOrderBy(IdArray)

一番望ましいでしょう

LINQ を使用してこれを達成できるはずだと思いますが、まだ方法を見つけていません。

コレクションの反復ごとにクエリを実行する必要があるため、現在の方法はあまり効率的ではないようです。コレクションが十分に大きい場合、パフォーマンスが低下する可能性があると思います。それは最終的に起こります。

これが私の現在の実装です:

    //this is just dummy data to show you whats going on
    int[] orderedIDs = new int[5] {5534, 5632, 2334, 6622, 2344};
    MemberObject[] searchResults = MyMethodToGetSearchResults();

    MemberObject[] orderedSearchResults = new MemberObject[orderedIDs.Count()];
    for(int i = 0; i < orderedIDs.Count(); i++)
    {
        orderedSearchResults[i] = searchResults
                                                .Select(memberObject => memberObject)
                                                .Where(memberObject => memberObject.id == orderedIDs[i])
                                                .FirstOrDefault();
    }
4

1 に答える 1

4

ブルートフォースの実装:

MemberObject[] sortedResults = 
      IdArray.Select(id => searchResults
                           .FirstOrDefault( item => item.id == id ))

ただし、これには IdArray 内のすべてのアイテムに対して searchResults を繰り返す必要があり、重複する ID を持つアイテムをうまく処理できません。

検索結果の ILookup を作成すると状況が改善され、IdArray 内の各項目の正しい検索結果を取得するのに O(1) 時間かかります。

ILookup<int, MemberObject> resultLookup = searchResults.ToLookup(x => x.id);

今:

MemberObject[] sortedResults = 
      IdArray.SelectMany(id => resultLookup[id])
于 2013-06-04T20:34:14.570 に答える