由于我使用的是.NET 1.1,因此我不能使用通用的字符串列表,因为泛型不是语言的一部分。所以我正在尝试使用StringBuilder,但得到这个错误的消息:
“foreach语句无法对'System.Text.StringBuilder'类型的变量进行操作,因为'System.Text.StringBuilder'不包含'GetEnumerator'的定义,或者它不可访问” < / p>
使用此代码:
public StringBuilder linesToSend;
. . .
foreach (string _line in this.linesToSend)
{
serialPort.Write(_line);
}
我的代码有什么问题,或者StringBuilder是否真的不允许使用foreach循环?如果是后者,那么String []是我最好的追索权吗?
答案 0 :(得分:4)
老问题,我知道,但可能有用的东西:
如果您的每个字符串都是使用.AppendLine构建的,或者您插入了新行,则可以执行
string[] delim = { Environment.NewLine, "\n" }; // "\n" added in case you manually appended a newline
string[] lines = StringBuilder.ToString().Split(delim, StringSplitOptions.None);
foreach(string line in lines){
// Do something
}
答案 1 :(得分:2)
StringBuilder
不会存储您追加的行。它只是用于构建最终字符串。假设您已经将所有内容添加到StringBuilder
,您可以执行以下操作:
// Write the complete string to the serialPort
serialPort.Write(linesToSend.ToString());
答案 2 :(得分:2)
StringBuilder
只构建一个字符串,那么你怎么能foreach
得到一整串字符串呢?
如果您需要逐行编写,可以使用ArrayList
,将每个行字符串添加到其中,将foreach
与string
一起添加为foreach
变量类型( Object
将投放到String
)。或者甚至更好,使用StringCollection
(感谢Anthony Pegram对原始问题的评论;我忘记了这个课程。)
但为什么不升级到更新版本的.NET?
答案 3 :(得分:2)
这是对的。 StringBuilder
旨在帮助您构建其他人已声明的最终输出字符串。
如果您需要使用可变数量的字符串,则可以使用ArrayList
并对其进行迭代。
ArrayList strings = new ArrayList();
// populate the list
foreach (string str in strings) {
// do what you need to.
}
如果您担心数组列表可能包含其他对象(因为它没有强类型),您可以安全地转换它:
foreach (object obj in strings) {
string str = obj as string;
// If null strings aren't allowed, you can use the following
// to skip to the next element.
if (str == null) {
continue;
}
}
答案 4 :(得分:2)
foreach
循环通过从接口GetEnumerator
调用IEnumerable
来工作,该接口将返回foreach
用于获取对象的下一个元素的枚举器。
StringBuilder
未实施允许IEnumerable
工作的IEnumerable<T>
或foreach
。在这种情况下,最好使用string[]
或StringCollection
,完成后,您可以使用StringBuilder
连接集合。
例如:
StringBuilder stringBuilder = new StringBuilder();
foreach(string line in array)
{
serialPort.Write(line);
stringBuilder.Append(line);
}
答案 5 :(得分:0)
如果你知道元素的数量,或者是字典,你要找的是一个字符串数组。