如何将字符串分割并修整成多个部分,且所有操作都在一行内完成?

166
我想要分割这一行:
string line = "First Name ; string ; firstName";

将它们的修剪版本转换为数组:

"First Name"
"string"
"firstName"

如何在一行中完成这个操作? 下面的代码会报错 "cannot convert type void":

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

3
错误是由于ForEach在当前IEnumerable实例上工作并返回void - Majkel
9个回答

381

尝试

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

提供参考,Foreach方法需要一个Action类型的参数(接收T并返回void),而你的lambda返回一个字符串,因为string.Trim返回一个字符串。

Foreach扩展方法旨在修改集合内对象的状态。由于字符串是不可变的,这将没有任何效果。


4
注意:ForEach不是扩展方法。 - Guffa
Linq中的最佳解决方案! - Sonhja
如果没有值,它会返回 null 吗? - Demodave
如果行为空,则会引发异常。如果行不包含“;”,则您将获得一个列表,其中包含与修剪行对应的一个字符串。 - Cédric Rup

27
< p > ForEach 方法并不返回任何东西,因此您无法将其分配给变量。

改用 Select 扩展方法:

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

20

在 .NET 5 之后,解决方案就变得非常简单:

string[] parts = line.Split(';', StringSplitOptions.TrimEntries);

2
是的!!!!!!终于!!!!!!(播放CeCe Peniston的歌曲:https://www.youtube.com/watch?v=xk8mm1Qmt-Y) - Pure.Krome
需要在末尾添加 .ToList() - secondplace

6

因为 p.Trim() 返回一个新的字符串。

你需要使用:

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

4

这里是一个扩展方法...

    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

或者尝试这个:

string[] parts = Regex.Split(line, "\\s*;\\s*");

这是一个很好的想法,但是我认为它会忽略字符串末尾的任何尾随空格,对吗? - jrichview

2

尝试使用正则表达式:

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

0

Split 返回字符串数组类型。编写扩展方法:

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

结果:

鲍勃

乔恩

男人

弗朗西斯

卢克

鲍勃

解释模式 [,;\s]:匹配逗号、分号或空格字符中的一个出现


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接