【问题标题】:Can I use StringBuilder elements in a foreach?我可以在 foreach 中使用 StringBuilder 元素吗?
【发布时间】:2013-02-11 18:06:31
【问题描述】:

因为我使用的是 .NET 1.1,所以我不能使用泛型字符串列表,因为泛型还不是语言的一部分。所以我正在尝试使用 StringBuilder,但得到这个错误消息:

“foreach 语句无法对 'System.Text.StringBuilder' 类型的变量进行操作,因为 'System.Text.StringBuilder' 不包含 'GetEnumerator' 的定义,或者无法访问”

使用此代码:

public StringBuilder linesToSend;
. . .

foreach (string _line in this.linesToSend)
{
    serialPort.Write(_line);
}

我的代码有什么问题,还是 foreach 循环真的不允许 StringBuilder?如果是后者,String[] 是我最好的办法吗?

【问题讨论】:

  • 尝试使用 List 或 ArrayList 代替 Clay
  • 注意:在 1.1 中,您可以使用 System.Collections.Specialized.StringCollection 代替缺少的 List
  • @DJKRAZE:如前所述,泛型在 .NET 1.1 中不可用
  • 我提到的粘土或ArrayList 以及..

标签: c# .net arrays foreach stringbuilder


【解决方案1】:

老问题,我知道,但可能有用:

如果你的每个字符串都是用 .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
}

【讨论】:

    【解决方案2】:

    StringBuilder 不存储您附加的行。它只是用于构建最终字符串。假设您已经将所有内容添加到 StringBuilder,您可以这样做:

    // Write the complete string to the serialPort
    serialPort.Write(linesToSend.ToString());
    

    【讨论】:

      【解决方案3】:

      这是正确的。正如其他人所说,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】:

        StringBuilder 只构建 一个 字符串,那么您如何通过foreach 获得完整的字符串序列?

        如果您需要逐行编写,可以使用ArrayList,将每一行字符串添加到其中,并将foreachstring 作为foreach 变量类型(Object 将转换为@ 987654329@)。或者更好的是,使用 StringCollection(感谢 Anthony Pegram 对原始问题的评论;我忘记了这门课)。

        但为什么不升级到更新版本的 .NET?

        【讨论】:

        • 对于这个项目,我无法升级。在其他项目中,我在 Windows 7 上使用 Visual Studio 2010,在 Windows 8 上使用 VS 2012,但该项目将保留在 VS 2003 / .NET 1.1
        【解决方案5】:

        foreach 循环通过从接口 IEnumerable 调用 GetEnumerator 来工作,这将返回一个枚举器,foreach 使用该枚举器来获取对象的下一个元素。

        StringBuilder 没有实现IEnumerableIEnumerable<T>,这将允许foreach 工作。在这种情况下,您最好使用string[]StringCollection,完成后您可以使用StringBuilder 连接集合。

        例如:

        StringBuilder stringBuilder = new StringBuilder();
        foreach(string line in array)
        {
            serialPort.Write(line);
            stringBuilder.Append(line);
        }
        

        【讨论】:

        • foreach 循环实际上是鸭式类型的操作数。如果操作数有一个名为GetEnumerator 的方法,其返回类型包括一个名为MoveNext 的无参数方法,它返回bool,以及一个名为Current 的可读属性,它返回控制变量类型,那么foreach 将不使用关于类型是实现IEnumerable还是IEnumerable<T>[如果类型显式实现IEnumerable<T>,但定义了一个与接口分离的GetEnumerator方法,foreach循环将使用后者]。
        【解决方案6】:

        如果您知道元素的数量,您正在寻找的是一个字符串数组,或者是一个字典。

        【讨论】:

        • 它是可变的,即您不必事先指明要放入其中的项目数量。虽然,我的意思是集合而不是字典。对不起。
        猜你喜欢
        • 2016-11-07
        • 1970-01-01
        • 2015-07-03
        • 1970-01-01
        • 1970-01-01
        • 2019-05-20
        • 1970-01-01
        • 2011-09-17
        • 2014-05-17
        相关资源
        最近更新 更多