将另一个列表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
列表,则使用此方法,但对于IQueryable
types不起作用,因为IQueryable
不包含IndexOf
的定义