この行を分割したい:
string line = "First Name ; string ; firstName";
トリミングされたバージョンの配列に:
"First Name"
"string"
"firstName"
これをすべて1行で行うにはどうすればよいですか?次の場合、「タイプvoidを変換できません」というエラーが表示されます。
List<string> parts = line.Split(';').ToList().ForEach(p => p.Trim());
この行を分割したい:
string line = "First Name ; string ; firstName";
トリミングされたバージョンの配列に:
"First Name"
"string"
"firstName"
これをすべて1行で行うにはどうすればよいですか?次の場合、「タイプvoidを変換できません」というエラーが表示されます。
List<string> parts = line.Split(';').ToList().ForEach(p => p.Trim());
回答:
試す
List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();
ちなみに、Foreachメソッドはパラメーターに対してアクション(Tを取り、voidを返す)を取り、ラムダは文字列として文字列を返します。Trimは文字列を返します
Foreach拡張メソッドは、コレクション内のオブジェクトの状態を変更するためのものです。文字列は不変なので、これは効果がありません
それが役に立てば幸い; o)
セドリック
ForEachは拡張メソッドではありません。
あるいは、これを試してください:
string[] parts = Regex.Split(line, "\\s*;\\s*");
正規表現を使用してみてください:
List<string> parts = System.Text.RegularExpressions.Regex.Split(line, @"\s*;\s*").ToList();
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;
}
正規表現を使用する
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回の出現に一致 またはスペース文字
ForEach現在のインスタンスで動作するため、エラーが返されIEnumerableますvoid。