文字列を分割してすべて1行に分割するにはどうすればよいですか?


124

この行を分割したい:

string line = "First Name ; string ; firstName";

トリミングされたバージョンの配列に:

"First Name"
"string"
"firstName"

これをすべて1行で行うにはどうすればよいですか?次の場合、「タイプvoidを変換できません」というエラーが表示されます。

List<string> parts = line.Split(';').ToList().ForEach(p => p.Trim()); 

2
とのForEach現在のインスタンスで動作するため、エラーが返されIEnumerableますvoid
マイケル

回答:


291

試す

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

ちなみに、Foreachメソッドはパラメーターに対してアクション(Tを取り、voidを返す)を取り、ラムダは文字列として文字列を返します。Trimは文字列を返します

Foreach拡張メソッドは、コレクション内のオブジェクトの状態を変更するためのものです。文字列は不変なので、これは効果がありません

それが役に立てば幸い; o)

セドリック


3
注:ForEachは拡張メソッドではありません。
Guffa

Linqのベストソリューション!
Sonhja

値がない場合はnullを返しますか?
Demodave

行がnullの場合、例外が発生します。行に「;」が含まれていない場合 あなたはtrimmidラインに対応する1つの文字列のリストを持っています
セドリックRupの

22

ForEachあなたは変数にそれを割り当てることはできませんので、この方法では、何も返しません。

Select代わりに拡張メソッドを使用します。

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

5

なぜなら、p.Trim()は新しい文字列を返すからです。

使用する必要があります:

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();


3

これが拡張メソッドです...

    public static string[] SplitAndTrim(this string text, char separator)
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            return null;
        }

        return text.Split(separator).Select(t => t.Trim()).ToArray();
    }

2

正規表現を使用してみてください:

List<string> parts = System.Text.RegularExpressions.Regex.Split(line, @"\s*;\s*").ToList();

0

Splitはstring []タイプを返します。拡張メソッドを記述します。

public static string[] SplitTrim(this string data, char arg)
{
    string[] ar = data.Split(arg);
    for (int i = 0; i < ar.Length; i++)
    {
        ar[i] = ar[i].Trim();
    }
    return ar;
}

私はあなたのソリューションが好きだったので、それに追加してより使いやすくすることにしました。

public static string[] SplitAndTrim(this string data, char[] arg)
{
    return SplitAndTrim(data, arg, StringSplitOptions.None);
}

public static string[] SplitAndTrim(this string data, char[] arg, 
StringSplitOptions sso)
{
    string[] ar = data.Split(arg, sso);
    for (int i = 0; i < ar.Length; i++)
        ar[i] = ar[i].Trim();
    return ar;
}

-1

正規表現を使用する

string a="bob, jon,man; francis;luke; lee bob";
			String pattern = @"[,;\s]";
            String[] elements = Regex.Split(a, pattern).Where(item=>!String.IsNullOrEmpty(item)).Select(item=>item.Trim()).ToArray();;			
            foreach (string item in elements){
                Console.WriteLine(item.Trim());

結果:

ボブ

ジョン

おとこ

フランシス

ルーク

風下

ボブ

Explainパターン[、; \ s]:、、;のいずれかの1回の出現に一致 またはスペース文字

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