我有2个列表对象,一个是一个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风格的解决方案,我总能希望。
非常感谢任何帮助。
答案 0 :(得分:117)
另一种LINQ方法:
var orderedByIDList = from i in ids
join o in objectsWithIDs
on i equals o.ID
select o;
答案 1 :(得分:25)
一种方法:
List<int> order = ....;
List<Item> items = ....;
Dictionary<int,Item> d = items.ToDictionary(x => x.ID);
List<Item> ordered = order.Select(i => d[i]).ToList();
答案 2 :(得分:13)
不是这个完全问题的答案,但是如果你有两个数组,那么Array.Sort
的重载需要对数组进行排序,并且一个用作'key'的数组
https://msdn.microsoft.com/en-us/library/85y6y2d3.aspx
Array.Sort方法(数组,数组)
对一对一维Array对象进行排序(一个包含键 而另一个包含相应的项目)基于键 第一个数组使用每个键的IComparable实现。
答案 3 :(得分:9)
Join
是最好的候选者(如果找不到匹配则得到一个空序列)。如果您只想获得其他列表的排序顺序(如果两个列表中的元素数相等),您可以使用Zip。
var result = objects.Zip(ints, (o, i) => new { o, i})
.OrderBy(x => x.i)
.Select(x => x.o);
非常易读。
答案 4 :(得分:4)
这是一个扩展方法,它为任何类型的列表封装Simon D.'s response。
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);
答案 5 :(得分:0)
一种可能的解决方案:
myList = myList.OrderBy(x => Ids.IndexOf(x.Id)).ToList();
注意:如果您使用In-Memory
列表,请使用此选项,但不适用于IQueryable
类型,因为IQueryable
不包含IndexOf
的定义
答案 6 :(得分:-1)
docs = docs.OrderBy(d => docsIds.IndexOf(d.Id)).ToList();