排序列表导致转换'void'错误

时间:2012-02-29 19:19:13

标签: c# .net

无法弄清楚为什么我尝试对列表进行排序时出现无效错误。 parameterList是一个字典,然后我将它转换为通用列表然后尝试排序。我希望将列表作为通用列表返回,如您所见:

   List<KeyValuePair<string,string>> sortedList = parameterList.ToList().Sort((left, right) => left.Key.Equals(right.Key, StringComparison.Ordinal)
                                                    ? string.Compare(left.Value, right.Value, StringComparison.Ordinal) 
                                                    : string.Compare(left.Key, right.Key, StringComparison.Ordinal));

错误:“Cannot convert source type 'void' to target type List<System.Collections.Generic.KeyValuePair<string,string>>

这是什么,它正在谈论......?

已更新

列表排序仍然不会使用我从http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs抓取的任何sugestions或我的原始排序代码进行排序

所以我就是这样:

        Dictionary<string, string> authParamsNonNormalized = new Dictionary<string, string> {
                                                                                                  {Constants.OAuthConsumerKey, consumerKey},
                                                                                                  {Constants.OAuthSignatureMethodKey, methodType},
                                                                                                  {Constants.OAuthTimestampKey, timeStamp()},
                                                                                                  {Constants.OAuthTokenKey, accessToken},
                                                                                                   {Constants.OAuthNonceKey, nonce},
                                                                                                  {Constants.OAuthVersionKey, Constants.OAuthVersion}
                                                                                              };

然后我将它转换为带有ToList()t的通用列表,因为这是包含此代码的方法的传入字典:

List<KeyValuePair<string,string>> sortedParamList = parameterList.ToList();
            sortedParamList.OrderBy(p => p.Key, StringComparer.Ordinal)
                                    .ThenBy(p => p.Value, StringComparer.Ordinal).ToList();

当我检查sortedParamList时,它仍然处于相同的顺序......没有发生任何事情。

更新:

废话,是的,我搞砸了最后一个,这是工作代码:

List<KeyValuePair<string, string>> sortedParamList = parameterList.OrderBy(p => p.Key, StringComparer.Ordinal)
                            .ThenBy(p => p.Value, StringComparer.Ordinal).ToList();

4 个答案:

答案 0 :(得分:2)

List<T>.Sort的所有重载都到位并且不返回任何内容。

或许IEnumerable<T>.OrderBy更适合您尝试做的事情。

答案 1 :(得分:2)

Sort方法是List的实例方法,并对当前实例进行排序,因此不会返回列表。

您需要拆分代码。

List<KeyValuePair<string,string>> sortedList = parameterList.ToList();
sortedList.Sort((left, right) => left.Key.Equals(right.Key, StringComparison.Ordinal)
                                     ? string.Compare(left.Value, right.Value, StringComparison.Ordinal) 
                                     : string.Compare(left.Key, right.Key, StringComparison.Ordinal));

答案 2 :(得分:2)

List<T>.Sort未返回已排序的列表;相反,它执行“就地”排序,改变调用它的列表实例。你可能想要使用:

List<KeyValuePair<string, string>> sortedList = parameterList.ToList();
sortedList.Sort((left, right) => left.Key.Equals(right.Key, StringComparison.Ordinal)
    ? string.Compare(left.Value, right.Value, StringComparison.Ordinal)
    : string.Compare(left.Key, right.Key, StringComparison.Ordinal));

以下LINQ在语义上是等效的,但更加清晰:

List<KeyValuePair<string, string>> sortedList =
    parameterList.OrderBy(p => p.Key, StringComparer.Ordinal)
                 .ThenBy(p => p.Value, StringComparer.Ordinal)
                 .ToList();

答案 3 :(得分:0)

.Sort((left, right) => ...

Sort方法为void,您无法将其放入列表&lt; ...&gt;