按一个列表排序另一个

时间:2010-10-15 20:36:21

标签: c# linq list sorting

我有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风格的解决方案,我总能希望。

非常感谢任何帮助。

7 个答案:

答案 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();