按一个列表排序另一个

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)

  • 我个人的经验是,Linq的表现总体上比许多人想象的要好得多,在大多数情况下,它只是语法糖最终执行与其他代码相同的操作,所以你通常不会感觉到差异.实际上,对于这个特殊情况我只知道它有效,我想如果它表现不好那么你将不得不选择一个完全不同的数据结构,因为这个完整的列表连接总是需要一些时间,无论你怎么做. (7认同)

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对象(一个包含键,另一个包含相应的项)进行排序.


naw*_*fal 9

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)

很可读.