0

我见过这样的类:

    /// <summary>
    /// Provides an internal structure to sort the query parameter
    /// </summary>
    protected class QueryParameter
    {
        public QueryParameter(string name, string value)
        {
            Name = name;
            Value = value;
        }

        public string Name { get; private set; }
        public string Value { get; private set; }
    }

    /// <summary>
    /// Comparer class used to perform the sorting of the query parameters
    /// </summary>
    protected class QueryParameterComparer : IComparer<QueryParameter>
    {
        public int Compare(QueryParameter x, QueryParameter y)
        {
            return x.Name == y.Name 
                ? string.Compare(x.Value, y.Value) 
                : string.Compare(x.Name, y.Name);
        }
    }

然后在代码中稍后有一个调用来进行排序:

parameters.Sort(new QueryParameterComparer());

一切正常。我认为创建一个只有名称值的 QueryParameter 类是浪费时间,使用 Dictionary 可能会更好。使用字典,而不是使用 Sort(new QueryParameterComparer()); 我想我可以这样做:

parameters.ToList().Sort((x, y) => x.Key == y.Key ? string.Compare(x.Value, y.Value) : string.Compare(x.Key, y.Key));

代码编译得很好,但我不确定它是否正常工作,因为列表似乎只是按照它放入的顺序输出。所以,谁能告诉我我这样做是否正确,或者我是否遗漏了一些简单的东西?

干杯/r3plica

4

3 回答 3

2

List<T>.Sort方法不是 LINQ 的一部分。

您可以在调用 ToList() 之前使用OrderBy/扩展方法:ThenBy

parameters = parameter.OrderBy(x => x.Key).ThenBy(x => x.Value).ToList();
于 2013-06-05T09:27:54.123 回答
2

从你的代码,我猜那parameters是你的字典,你在打电话

parameters.ToList().Sort(...);

然后继续使用parameters

ToList()创建一个新列表;然后,您对该列表进行排序并丢弃它。您根本没有排序parameters,实际上您无法对其进行排序,因为它是一本字典。

你需要的是类似的东西

var parametersList = parameters.ToList();
parametersList.Sort(...);

where...与之前的排序相同。

你也可以做

var parametersList = parameters.OrderBy(...).ToList();

这是一种更 LINQ-y 的做事方式。

甚至可能只做例如

foreach(var kvp in parameters.OrderBy(...))

(或者您打算使用排序序列)如果您使用排序序列的频率高于更改字典的频率(即没有必要缓存排序版本,因为原始数据变化很大)。


还有一点需要注意——字典不能包含重复的键,所以没有必要再检查x.Key == y.Key了——你只需要通过排序(x, y) => string.Compare(x.Key, y.Key)

不过,我在这里要小心 - 从外观上看,原始代码确实支持重复键,因此通过切换到字典,您可能会破坏某些东西。

于 2013-06-05T09:28:15.213 回答
0

字典仅相当于两个哈希映射,并允许您以恒定时间 O(1) 访问任何元素(给定键)(因为在哈希表上进行查找搜索)。

因此,如果您因为打算稍后进行二分搜索而对元素进行排序,则不需要直接使用字典(或者如果您要查询字典中的两个值,则可以使用具有相同元素的几个字典但切换键值对)。

正如有人在我之前写的那样,如果您的问题是如何使用 linq 订购列表,您应该使用 linq 和 orderby thenby。

于 2013-06-05T09:33:55.607 回答