JGi*_*tin 72 c# linq sorting list
我有2个列表对象,一个是一个int列表,另一个是对象列表,但对象有一个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;
}
Run Code Online (Sandbox Code Playgroud)
当用户搜索成员时,最重要的是它们以随机顺序显示,然后如果他们点击第2页,它们将保持该顺序,并显示接下来的20个结果.
我一直在阅读有关我可以在Linq.OrderBy子句中用作参数的ICompare,但我找不到任何简单的例子.
我希望有一个优雅,非常简单的LINQ风格的解决方案,我总能希望.
任何帮助都非常感谢.
Sim*_* D. 117
另一种LINQ方法:
var orderedByIDList = from i in ids
join o in objectsWithIDs
on i equals o.ID
select o;
Run Code Online (Sandbox Code Playgroud)
Jim*_*mmy 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();
Run Code Online (Sandbox Code Playgroud)
Mar*_*wul 13
这个确切的问题不是答案,但是如果你有两个数组,那么有一个重载Array.Sort需要数组排序,一个数组用作'关键'
https://msdn.microsoft.com/en-us/library/85y6y2d3.aspx
Array.Sort方法(Array,Array)
使用每个键的IComparable实现,根据第一个Array中的键对一对一维Array对象(一个包含键,另一个包含相应的项)进行排序.
Join如果你想匹配完全整数(如果没有找到匹配,你得到一个空序列)是最好的候选者.如果你只想获得另一个列表的排序顺序(如果两个列表中的元素数量相等),你可以使用Zip.
var result = objects.Zip(ints, (o, i) => new { o, i})
.OrderBy(x => x.i)
.Select(x => x.o);
Run Code Online (Sandbox Code Playgroud)
很可读.
| 归档时间: |
|
| 查看次数: |
35253 次 |
| 最近记录: |