这是我的问题:
我有一个句子,我使用Message.Text.Split(" ")
将其拆分以得到一个单词数组,但是有些单词可能会被'
而不是空格分隔(例如all'una
)。
如果发生这种情况,则数组元素将为all'una
,而不必分离元素all
和una
。所以我为获得结果所做的是:
'loop start (tried for, for each and while using words.GetEnumerator())
'do stuff here
If word.Contains("'") Then
Dim apos() As String = word.Split("'")
For Each subword As String In apos
words.Add(it)
Next
End If
'do other stuff here
'loop end
问题是单词数组(或列表)正确地改变了它的大小,但循环忽略了新元素。 我查看了互联网并阅读了这篇文章:
修改集合。 GetEnumerator返回的枚举器对象通常不允许您通过添加,删除,替换或重新排序任何元素来更改集合。如果在启动For Each ... Next循环后更改集合,则枚举器对象将变为无效,并且下次尝试访问元素会导致InvalidOperationException异常。 但是,这种修改阻塞不是由Visual Basic决定的,而是由IEnumerable接口的实现决定的。可以以允许在迭代期间进行修改的方式实现IEnumerable。如果您正在考虑进行此类动态修改,请确保您了解正在使用的集合上IEnumerable实现的特征。
这是我唯一的解决方案吗?
答案 0 :(得分:2)
String.Split
接受一系列令牌字符。
Message.Text.Split({" "c, "'"c})
答案 1 :(得分:0)
您不仅要添加新单词,还要删除原始单词。否则,您将在集合中同时拥有all'una
,all
和una
。
您可以为结果使用不同的集合,并将未更改的项目或拆分项目的结果复制到其中:
Dim result As New List(Of String)
For Each word As String in words
If word.Contains("'")
result.AddRange(word.Split("'"C))
Else
result.Add(word)
End If
Next