2012-02-29 127 views
1

无法弄清楚为什么我在尝试对列表进行排序时遇到无效错误。 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(); 
+0

我会考虑写一个比较器,因为这是一个非常复杂的比较。通过这种方式,你可以将那些令人讨厌的代码从该行中移出并放在自己的位置。 – 2012-02-29 19:28:11

+0

Nooo ...'OrderBy' *返回排序后的可枚举值;它不会像Sort一样在原地进行排序。我知道这可能会让很多人感到困惑。您需要将'parameterList.OrderBy'操作的结果分配给目标变量。看我下面的例子。 – Douglas 2012-02-29 21:16:57

+0

是啊我可能会在稍后创建一个实用方法...现在这只是代码来试图让这个工作,这是一个新的包装我正在建设,然后我会回去清理它。 – PositiveGuy 2012-02-29 21:25:02

回答

2

List<T>.Sort不返回排序列表;相反,它执行“in-place”排序,更改所调用的列表实例。你可能打算用:

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(); 
+0

是的,我终于看到现在......呃。 – PositiveGuy 2012-02-29 20:55:59

+0

由于某种原因,上面列出了我的列表。排序后,我仍然会得到一个无序列表。 – PositiveGuy 2012-02-29 21:02:46

+0

你确定你正在访问'sortedList'来检查,而不是'parameterList'?如果是的话,你可以发布一些你如何初始化'parameterList'的示例代码? – Douglas 2012-02-29 21:05:06

2

所有List<T>.Sort排序到位的重载,不返回任何东西。

也许IEnumerable<T>.OrderBy会更适合你想要做的事情。

+0

它肯定会比创建列表更好_then_排序。它应该对收集进行排序并将结果放入列表中。 – 2012-02-29 19:30:12

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)); 
0
.Sort((left, right) => ... 

Sort方法是void,你不能把它放在一个列表里面< ...>

相关问题