C#構文-カンマで文字列を配列に分割、ジェネリックリストに変換、逆順


92

これの正しい構文は何ですか?

IList<string> names = "Tom,Scott,Bob".Split(',').ToList<string>().Reverse();

何をめちゃくちゃにしていますか?TSourceの意味?

回答:


251

問題は、あなたがList<T>.Reverse()を返すということですvoid

あなたはどちらかをすることができます:

List<string> names = "Tom,Scott,Bob".Split(',').ToList<string>();
names.Reverse();

または:

IList<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>();

後者は、任意のものIEnumerable<T>を元に戻すにはすべてのデータをバッファリングしてからすべてを生成する必要があるため、よりコストがかかりList<T>ます。(ここでの違いEnumerable.Reverse<T>()は、List<T>.Reverse()インスタンスメソッドではなく、拡張メソッドを呼び出すことです。)

さらに効率的ですが、次のものを使用できます。

string[] namesArray = "Tom,Scott,Bob".Split(',');
List<string> namesList = new List<string>(namesArray.Length);
namesList.AddRange(namesArray);
namesList.Reverse();

これにより、不適切なサイズのバッファーの作成が回避されます-実行する場所で4つのステートメントを実行することを犠牲にして...いつものように、実際の使用例では、読みやすさとパフォーマンスを比較検討してください。


25
スキートは獣です!

2
よく練られて、本当に感謝しています!
Gaurav Aroraa 2011年

11

この質問はかなり古いのですが、文字列にスペースが含まれていることを除いて、同様の問題がありました。文字列をコンマだけで区切る方法を知る必要がある場合:

string str = "Tom, Scott, Bob";
  IList<string> names = str.Split(new string[] {","," "},
  StringSplitOptions.RemoveEmptyEntries);

StringSplitOptionsは、スペース文字のみになるレコードを削除します...


トムだけではなく「トムクルーズ」を使用している場合、これは機能しません
炎上2017


1

これを試して:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();

エラーが発生する-型 'void'を暗黙的に 'System.Collections.Generic.List <string>に変換できない
BuddyJoe

1

ここで欠けているのは、.Reverse()がvoidメソッドであることです。.Reverse()の結果を変数に割り当てることはできません。ただし、Enumerable.Reverse()を使用して結果を取得するように順序を変更できます

var x = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>()

違いは、Enumerable.Reverse()がvoidではなくIEnumerable <T>を返すことです。


1

あなたがしようとしている場合

  1. 複数の区切り文字を使用する
  2. 空の文字列をフィルタリングする
  3. 先頭/末尾のスペースを削除する

以下はうまくいくはずです:

string str = "Tom Cruise, Scott, ,Bob | at";
IEnumerable<string> names = str
                            .Split(new char[]{',', '|'})
                            .Where(x=>x!=null && x.Trim().Length > 0)
                            .Select(x=>x.Trim());

出力

  • トム
  • クルーズ
  • スコット
  • ボブ

これで、他の人が示唆するように、順序を明らかに逆にすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.