C# - 解析文本行 - 最佳方法是什么?

4

可能重复:
在 C# 中从字符串中解析多个双精度浮点数

假设我有一行文本,如下所示:

"45.690 24.1023 .09223 4.1334"

在 C# 中,从这行文本中提取数字的最有效方法是什么?每个数字之间的空格数量因行而异,且无法预测。由于我需要执行此操作数千次,因此效率至关重要。

谢谢。


4
请将文本从英语翻译成中文。仅返回翻译后的文本:完全重复:https://dev59.com/qEnSa4cB1Zd3GeqPMkus - dtb
你需要提取的内容是什么?456902410230922341334吗? - Ta01
你可能会在这里找到一些有用的资料:https://dev59.com/QnI_5IYBdhLWcg3wBuRs,尽管这些解决方案仅适用于整数。 - finnw
4个回答

5
IEnumerable<double> doubles = s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                               .Select<string, double>(double.Parse)

已更新为使用StringSplitOptions.RemoveEmptyEntries,因为空格数量会有所不同


@dtb 感谢您的评论,正好在您发表评论时我正在修复。 - Rob Fonseca-Ensor
如果你将它改为:s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(double.Parse),那么它就能正常工作了! - Randy Minder

2
使用正则表达式分割。这将允许您在数字之间的任何长度的任何空格上进行分割:
string input = "45.690 24.1023 .09223 4.1334";
string pattern = "\\s*";            // Split on whitepsace

string[] substrings = Regex.Split(input, pattern);
foreach (string match in substrings)
{
   Console.WriteLine("'{0}'", match);
}

把一个“&”符号扔进去,你就得到了+1。 - Sky Sanders
模式难道不应该是“\s+”吗? - Rob Fonseca-Ensor
是的,没错。很抱歉,在VB和C#之间切换时我的手指有些混乱。 - Joel Etherton
@Sky:我应该把这个“&”放在哪里? - Joel Etherton
嗯,在你刚才放的引号之前加上转义符... 六个一样,半打其他。+1 - Sky Sanders

0
我没有测量过,但如果你想要高效,简单就是关键,所以可能会选择类似这样的东西。
var chars = new List<char>();
for( int i =0; i < numChars; ++i )
    if( char.IsDigit( text[i] ) )
        chars.Add(text[i]);

0

You want efficient.....

var regex = new Regex(@"([\d\.]+)",  RegexOptions.Compiled)
var matches = regex.Matches(input);

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