web-dev-qa-db-ja.com

あるリストを別のリストで並べ替える

リストオブジェクトは2つあり、1つは単なるintのリスト、もう1つはオブジェクトのリストですが、オブジェクトにはIDプロパティがあります。

私がやりたいのは、intのリストと同じソート順で、IDでオブジェクトのリストをソートすることです。

私はしばらくそれを動かそうと試みていましたが、今のところ喜びはありませんが、

ここに私がこれまでに持っているものがあります...

//**************************
//*** Randomize the list ***
//**************************
if (Session["SearchResultsOrder"] != null)
{
    // save the session as a int list
    List<int> IDList = new List<int>((List<int>)Session["SearchResultsOrder"]);
    // the saved list session exists, make sure the list is orded by this
    foreach(var i in IDList)
    {
        SearchData.ReturnedSearchedMembers.OrderBy(x => x.ID == i);
    }
}
else
{
    // before any sorts randomize the results - this mixes it up a bit as before it would order the results by member registration date                        
    List<Member> RandomList = new List<Member>(SearchData.ReturnedSearchedMembers);
    SearchData.ReturnedSearchedMembers = GloballyAvailableMethods.RandomizeGenericList<Member>(RandomList, RandomList.Count).ToList();

    // save the order of these results so they can be restored back during postback
    List<int> SearchResultsOrder = new List<int>();
    SearchData.ReturnedSearchedMembers.ForEach(x => SearchResultsOrder.Add(x.ID));
    Session["SearchResultsOrder"] = SearchResultsOrder;
}   

つまり、ユーザーがメンバーを検索すると、最初はランダムな順序で表示され、2ページ目をクリックするとその順序のままになり、次の20の結果が表示されます。

私はLinq.OrderBy句のパラメーターとして使用できるICompareについて読んでいますが、簡単な例は見つかりません。

エレガントで非常にシンプルなLINQスタイルのソリューションを望んでいます。

どんな助けでも大歓迎です。

72
JGilmartin

別のLINQアプローチ:

 var orderedByIDList = from i in ids 
                       join o in objectsWithIDs
                       on i equals o.ID
                       select o;
117
Simon D.

それを行う1つの方法:

List<int>  order = ....;
List<Item> items = ....;

Dictionary<int,Item> d = items.ToDictionary(x => x.ID);

List<Item> ordered = order.Select(i => d[i]).ToList();
25
Jimmy

このexact質問に対する答えではありませんが、2つのarraysがある場合、Array.Sort並べ替える配列と、「キー」として使用する配列を受け取ります

https://msdn.Microsoft.com/en-us/library/85y6y2d3.aspx

Array.Sortメソッド(Array、Array)
各キーのIComparable実装を使用して、最初の配列のキーに基づいて、一対の1次元配列オブジェクト(一方にはキーが含まれ、他方には対応するアイテムが含まれます)をソートします。

13
Mark Sowul

Joinは、正確な整数で一致させたい場合に最適な候補です(一致が見つからない場合は、空のシーケンスが得られます)。他のリストの並べ替え順序を取得するだけの場合(および両方のリストの要素数が等しい場合)、 Zip を使用できます。

var result = objects.Zip(ints, (o, i) => new { o, i})
                    .OrderBy(x => x.i)
                    .Select(x => x.o);

かなり読みやすい。

9
nawfal

これは、あらゆるタイプのリストに対して Simon D.の応答 をカプセル化する拡張メソッドです。

public static IEnumerable<TResult> SortBy<TResult, TKey>(this IEnumerable<TResult> sortItems,
                                                         IEnumerable<TKey> sortKeys,
                                                         Func<TResult, TKey> matchFunc)
{
    return sortKeys.Join(sortItems,
                         k => k,
                         matchFunc,
                         (k, i) => i);
}

使用法は次のようなものです。

var sorted = toSort.SortBy(sortKeys, i => i.Key);
4
gregsdennis