リストオブジェクトは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スタイルのソリューションを望んでいます。
どんな助けでも大歓迎です。
別のLINQアプローチ:
var orderedByIDList = from i in ids
join o in objectsWithIDs
on i equals o.ID
select o;
それを行う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();
このexact質問に対する答えではありませんが、2つのarraysがある場合、Array.Sort
並べ替える配列と、「キー」として使用する配列を受け取ります
https://msdn.Microsoft.com/en-us/library/85y6y2d3.aspx
Array.Sortメソッド(Array、Array)
各キーのIComparable実装を使用して、最初の配列のキーに基づいて、一対の1次元配列オブジェクト(一方にはキーが含まれ、他方には対応するアイテムが含まれます)をソートします。
Join
は、正確な整数で一致させたい場合に最適な候補です(一致が見つからない場合は、空のシーケンスが得られます)。他のリストの並べ替え順序を取得するだけの場合(および両方のリストの要素数が等しい場合)、 Zip を使用できます。
var result = objects.Zip(ints, (o, i) => new { o, i})
.OrderBy(x => x.i)
.Select(x => x.o);
かなり読みやすい。
これは、あらゆるタイプのリストに対して 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);