如何只从字符串中获取第一行?

tai*_*ito 23 c# string visual-studio

例:

string str = "Lorem ipsum dolor sit amet, 
consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.";

string firstline;
Run Code Online (Sandbox Code Playgroud)

如何从字符串"str"到字符串"firstline"的第一行?

Mar*_*zek 54

而不是string.Split我会使用string.Substringstring.IndexOf只获得第一行,并避免不必要string[]的整个输入字符串.

string firstline = str.Substring(0, str.IndexOf(Environment.NewLine));
Run Code Online (Sandbox Code Playgroud)

  • 如果字符串不包含换行符,则会抛出异常. (25认同)

Tim*_*ers 45

.NET已经有了一个读取器:StringReader.这样可以避免担心换行符的构成,以及字符串中是否存在换行符.

 string first = new StringReader(str).ReadLine();
Run Code Online (Sandbox Code Playgroud)

  • 这需要更高的评级. (9认同)

Dou*_*las 18

String.Split将创建一个完整的子串数组,这对您的要求是浪费的.我建议使用基于索引的方法:

int index = str.IndexOfAny(new char[] { '\r', '\n' });
string firstline = index == -1 ? str : str.Substring(0, index);
Run Code Online (Sandbox Code Playgroud)


Kon*_*osa 15

假设你的字符串确实包含新行(\r\n),你可以使用:

string line1 = str.Split(new [] { '\r', '\n' }).FirstOrDefault()
Run Code Online (Sandbox Code Playgroud)

  • 这会创建太多不需要的字符串对象,并且很容易在非常大的输入上失败 (11认同)
  • @SargeBorsch,我看到三行和OP不是在谈论GB的daa所以我相信没有这么大的优惠 (4认同)
  • @KonradKokosa - 目前可能是这样,但数据有一种随着时间推移而扩展的方式.拥有一个从一开始就可以扩展的解决方案比必须确定未来某个时间内存使用量突然增加的地方要好得多. (2认同)

Fer*_*cio 5

使用LINQ,您可以有一个简单的解决方案,它避免了最初将整个字符串拆分为字符串集合的开销。

string first = new string(str.TakeWhile(c => c != '\n').ToArray());
Run Code Online (Sandbox Code Playgroud)


Dmi*_*rov 5

单线解决方案:

string firstline = str.Split(new string[] { Environment.NewLine }, 2, StringSplitOptions.RemoveEmptyEntries);
Run Code Online (Sandbox Code Playgroud)

这里第二个参数(=2)意味着找到第一行后,不再需要将该行进一步拆分为数组,因此它的工作速度更快。