2012-02-29 13 views
1

リストをソートしようとすると、何故voidエラーが発生するのか分かりません。 parameterListは当初は辞書であり、それからジェネリックリストに変換してソートを試みます。リストを並べ替えると「void」エラーが発生する

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>>

それは話して、このボイドは何ですか... ??

を更新し、私は戻って、あなたが見ることができるように、一般的なリストとしてリストが欲しいです

リストの並べ替えは、Sugestionsや元の並べ替えコードのいずれかを使用してソートされません。http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs

だから、これは私はそれを持っているかである:

 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メソッド()トンと一般的なリストに変換します

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

それは本当に複雑な比較だから私はそのための比較演算を書い検討したいです。そうすれば、その行とその場所で、その厄介なコードを手に入れることができます。 –

+0

Nooo ... 'OrderBy' *はソートされた列挙可能な値を返します。 'Sort'のようにインプレースでソートしません。私はこれが多くの人にとって混乱するかもしれないことを知っています。 'parameterList.OrderBy'演算の結果をターゲット変数に代入する必要があります。下の私の例を見てください。 – Douglas

+0

yeaおそらく私は後でユーティリティメソッドを作成します...これはちょうどこの作業をしようとするコードです、これはビルドしている新しいラッパーです、そして、私は戻ってクリーンアップします。 – PositiveGuy

答えて

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

うん、私はついにそれを見た。何らかの理由で上記のいずれかが私のリストを並べ替えて – PositiveGuy

+0

私はまだ並べ替えの後で順序付けられていないリストで終わる。 – PositiveGuy

+0

'parameterList'ではなく' sortedList'にアクセスしていますか?もしそうなら、 'parameterList'をどのように初期化するのかのサンプルコードを投稿できますか? – Douglas

2

場所でList<T>.Sort一種のオーバーロードのすべてのと何も返しません。

おそらくIEnumerable<T>.OrderByは、あなたがしようとしているものに適しています。

+0

リストを作成するよりはるかに良いでしょう_then_ソート。コレクションをソートし、結果をリストに入れる必要があります。 –

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あり、そしてあなたがリスト<の内側にそれを置くことができない...>

関連する問題