将另一个列表sorting

我有2个列表对象,其中一个是整数列表,另一个是对象列表,但对象具有ID属性。

我想要做的是sorting对象的列表中的ID按与列表相同的sorting顺序。

我已经玩了一会儿,试图让它工作,迄今没有喜悦,

这是我迄今为止…

//************************** //*** 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; } 

当用户search成员时,最重要的是他们以随机的顺序显示,如果他们点击页面2,他们将保持这个顺序,并显示下面的20个结果。

我一直在阅读有关ICompare我可以用作Linq.OrderBy子句中的参数,但我找不到任何简单的例子。

我希望有一个优雅,非常简单的LINQ风格的解决scheme,我总是希望。

任何帮助最受赞赏。

另一个LINQ方法:

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

一种做法:

 List<int> order = ....; List<Item> items = ....; Dictionary<int,Item> d = items.ToDictionary(x => x.ID); List<Item> ordered = order.Select(i => d[i]).ToList(); 

不是这个确切问题的答案,但是如果你有两个数组Array.Sort的重载需要数组sorting,而一个数组可以用作'key'

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

Array.Sort方法(数组,数组)
根据第一个数组中的键,使用每个键的IComparable实现对一对一维数组对象(一个包含键,另一个包含相应的项目)进行sorting。

如果你想匹配确切的整数(如果没有find匹配,你得到一个空序列), Join是最好的候选人。 如果只想获得另一个列表的sorting顺序(并且提供了两个列表中的元素数量相等),则可以使用Zip 。

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

很可读。

这里是一个扩展方法,它封装了Simon D.对任何types的列表的响应 。

 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); 

一个可能的scheme

 myList = myList.OrderBy(x => Ids.IndexOf(x.Id)).ToList(); 

注意:如果使用In-Memory列表,则使用此方法,但对于IQueryabletypes不起作用,因为IQueryable不包含IndexOf的定义