代码之家  ›  专栏  ›  技术社区  ›  JGilmartin

按列表排序

  •  72
  • JGilmartin  · 技术社区  · 15 年前

    我有两个列表对象,一个只是一个int列表,另一个是一个对象列表,但是对象有一个ID属性。

    我要做的是按ID对对象列表进行排序,排序顺序与int列表相同。

    我已经玩了一段时间了,现在想让它工作,到目前为止没有乐趣,

    这是我到目前为止所拥有的。。。

    //**************************
    //*** 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风格的解决方案,我可以一直希望。

    非常感谢您的帮助。

    6 回复  |  直到 9 年前
        1
  •  117
  •   Simon D.    13 年前

    另一种LINQ方法:

     var orderedByIDList = from i in ids 
                           join o in objectsWithIDs
                           on i equals o.ID
                           select o;
    
        2
  •  25
  •   Jimmy    15 年前

    一种方法是:

    List<int>  order = ....;
    List<Item> items = ....;
    
    Dictionary<int,Item> d = items.ToDictionary(x => x.ID);
    
    List<Item> ordered = order.Select(i => d[i]).ToList();
    
        3
  •  14
  •   Mark Sowul    10 年前

    不是这个问题的答案 准确的 问题,但如果你有两个 数组 Array.Sort 将数组排序,并将数组用作“键”

    https://msdn.microsoft.com/en-us/library/85y6y2d3.aspx

    Array.Sort方法(Array,Array)
    排序一对一维数组对象(其中一个包含键 另一个包含相应的项)基于 使用每个键的IComparable实现的第一个数组。

        4
  •  9
  •   nawfal Donny V.    10 年前

    Join 如果您想要匹配精确的整数(如果找不到匹配,则会得到空序列),则是最佳候选。如果只想获得另一个列表的排序顺序(并且两个列表中的元素数量相等),可以使用 Zip

    var result = objects.Zip(ints, (o, i) => new { o, i})
                        .OrderBy(x => x.i)
                        .Select(x => x.o);
    

    很有可读性。

        5
  •  4
  •   Community Mohan Dere    9 年前

    下面是一个扩展方法,它封装了 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);
    
        6
  •  0
  •   Mehdi Dehghani    9 年前

    一种可能的解决方案:

    myList = myList.OrderBy(x => Ids.IndexOf(x.Id)).ToList();
    

    注意:如果您使用 In-Memory 列表,不适用于 IQueryable 类型,作为 可液化的 不包含的定义 IndexOf