2012-02-29 63 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,你不能把它放在一個列表裏面< ...>

相關問題