C# 与TextFieldParser等效的StringSplitOptions.RemoveEmptyEntries

C# 与TextFieldParser等效的StringSplitOptions.RemoveEmptyEntries,c#,parsing,textfieldparser,C#,Parsing,Textfieldparser,我最近学习了TextFieldParser来解析words,以前我会使用string.Split来解析。我有一个关于新学习的课程的问题 如果我们使用string.Split和StringSplitOptions.removeMptyEntries来解析这样的消息 string message = "create myclass \"56, 'for better or worse'\""; //have multiple spaces string[] words = message.

我最近学习了
TextFieldParser
来解析
words
,以前我会使用
string.Split来解析。我有一个关于新学习的
课程的问题

如果我们使用
string.Split
StringSplitOptions.removeMptyEntries来解析这样的消息

string message = "create    myclass   \"56, 'for better or worse'\""; //have multiple spaces
string[] words = message.Split(new char[] { ' ' }, 3, StringSplitOptions.RemoveEmptyEntries);
然后我们将得到
单词
,其中包含如下三个元素:

[0] create
[1] myclass
[2] "56, 'for better or worse'"
但是如果我们使用
TextFieldParser

string str = "create    myclass   \"56, 'for the better or worse'\"";
var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(new StringReader(str)); //treat string as I/O
parser.Delimiters = new string[] { " " };
parser.HasFieldsEnclosedInQuotes = true; 
string[] words2 = parser.ReadFields();
然后
返回
将由一些不带文本的
单词组成

[0] create
[1]
[2]
[3]
[4] myclass
[5]
[6]
[7] "56, 'for better or worse'"

现在有没有等效的方法可以将结果数组中的空
字作为
string.Split
StringSplitOptions.removeMptyEntries
删除?

可能这样就可以了

parser.HasFieldsEnclosedInQuotes = true;
string[] words2 = parser.ReadFields();
words2 = words2.Where(x => !string.IsNullOrEmpty(x)).ToArray();
一个班轮替代方案可能是

string[] words2 = parser.ReadFields().Where(x => !string.IsNullOrEmpty(x)).ToArray();

这看起来不像CSV。为什么您要使用VB6 TextFieldParser而不是String.Split或Regex?@Pierre Lucpinoult先生,我不知道这是否通常用于(仅用于)CSV文本。但在我的前一个问题中,两位知名人士建议我用它来解析我的文本,他们说这样做性能更好。因为我是新来的,所以我相信他们的判断,并使用这个。这是帖子:如果你能给我一个选择,我会很高兴的view@Pierre-幸运的是,我打开了你给我的链接,读了时差!这怎么可能!请参阅我提供的链接。这里的观点完全不同。String.Split只是分割字符串,而另一个有更多的逻辑来遵守CSV的规范。所以对于一个简单的作业字符串来说,Split会快得多。起初我以为你只是在寻找另一个选择,但是你的东西更像是一个奇怪的CSV,但是用n个空格隔开。除非添加一些逻辑,否则String.Split将无法遵循所有CSV规范,但正则表达式可以很好地完成这项工作,并正确处理空格数。您可以对两者进行基准测试,但我怀疑最终正则表达式的使用会更简单,速度也会一样快。在这种情况下,这更多是因为开销,而不是严格地在VB程序集中。臃肿的CSV解析器库也会有相同的结果。我没有任何关于C#vs VB项目中VB程序集的数据,所以我不能肯定。但我猜这两个都会被转换成几乎相同的MSIL,所以这无关紧要。
TextFieldParser
非常慢,因为它是
TextFieldParser
。DotNetPerls也做了一些基准测试和测试。谢谢您的及时回复,先生。但这似乎不起作用。我想到了我可以使用的
LINQ
但是。我会移除装饰并使用!IsNullOrWhiteSpace(tag)请删除第一个实现,它实际上不起作用。另外,您可以在一行中完成这一切:
string[]words2=parser.ReadFields().Where(x=>!string.IsNullOrEmpty(x)).ToArray()