标签: stringbuilder

字符串连接在C#中不安全,需要使用StringBuilder吗?

我的问题是: C#中的字符串连接是否安全?如果字符串连接导致意外错误,并且使用StringBuilder替换该字符串连接会导致这些错误消失,那可能表示什么?

背景:我正在开发一个小命令行C#应用程序.它接受命令行参数,执行稍微复杂的SQL查询,并将大约1300行数据输出到格式化的XML文件中.

我的初始程序总是在调试模式下正常运行.但是,在发布模式下,它将获得大约第750个SQL结果,然后因错误而死亡.错误是无法读取某一列数据,即使通过SqlDataReader对象的Read()方法刚刚返回true也是如此.

通过对代码中的所有操作使用StringBuilder来修复此问题,之前已经存在"string1 + string2".我不是在谈论SQL查询循环中的字符串连接,其中StringBuilder已经在使用中.我在谈论代码中较早的两个或三个短字符串变量之间的简单连接.

我的印象是C#足够聪明,可以通过添加几个字符串来处理内存管理.我错了吗?或者这是否表明其他一些代码问题?

c# string stringbuilder string-concatenation

5
推荐指数
3
解决办法
5877
查看次数

NULL对象的StringBuffer行为

当NULL对象附加到实例时,我无法理解StringBuilder的以下行为:

public class StringBufferTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String nullOb = null;
        StringBuilder lsb = new StringBuilder();

        lsb.append("Hello World");
        System.out.println("Length is: " + lsb.length());// Prints 11. Correct

        lsb.setLength(0);
        System.out.println("Before assigning null" + lsb.length());    
        lsb.append(nullOb);
        System.out.println("Length now is:" + lsb.length()); // Prints 4. ???
    }

}
Run Code Online (Sandbox Code Playgroud)

最后一个打印语句不打印0.任何人都可以帮我理解行为吗?

java null stringbuilder

5
推荐指数
1
解决办法
1万
查看次数

Java Stringbuilder.replace

考虑以下输入:

String[] input = {"a9", "aa9", "a9a9", "99a99a"};
Run Code Online (Sandbox Code Playgroud)

使用StringBuilder直接替换9之前的任何数字与字母表后面的下一个字母时,最有效的方法是什么?

处理完这些输入后,输出应为:

String[] output = {"b9", "ab9", "b9b9", "99b99a"}
Run Code Online (Sandbox Code Playgroud)

我一直在摸不着头脑,而StringBuilder.setCharAt是我能想到的最好的方法.

任何建议或意见将不胜感激.

java string stringbuilder

5
推荐指数
1
解决办法
1090
查看次数

使用StringBuilder的回文检查器

我试图创建一个回文检查器.我正在使用StringBuilder,我发现附加空格有点棘手.

编辑:除了使用.reverse()之外还有其他方法吗?谢谢你的回答.:d

当单词没有空格时,此代码有效:

public String palindrome (String anyString) {

StringBuilder sb = new StringBuilder();

for (int i = anyString.length()-1; i>=0; i--) {
        sb.append(anyString.charAt(i));
}

String string2 = sb.toString();

return string2;
}
Run Code Online (Sandbox Code Playgroud)

当输入的单词有空格时; 它返回一个字符串,其中包含第一个空格的字符.

例如:

word = "not a palindrome"
palindrome(word) = "emordnilap"
Run Code Online (Sandbox Code Playgroud)

期待 ="emordnilap一吨"


我试过插入

if (anyString.charAt(i) != ' ')
    sb.append(anyString.charAt(i));
else 
    sb.append(' ');
Run Code Online (Sandbox Code Playgroud)

在代码的中间,但它不起作用.

多谢你们!

java stringbuilder palindrome

5
推荐指数
1
解决办法
6549
查看次数

在Java中迭代StringBuilder的标准方法?

我很惊讶我找不到回答这个问题的现有问题.

在Java中使用StringBuilder迭代所有字符的标准方法是什么?

显而易见的路线是将其转换为String然后使用toCharArray().问题是,我正在处理成千上万个独特的字符串,我做了大量的追加,我认为我必须实施内存和性能问题.

编辑:为了澄清,我不是手动实习字符串,但我的理解是,他们会自动实习,那如果我叫toString了一个StringBuilder,他们将被拘留.也许我误会了.

java stringbuilder iterator loops

5
推荐指数
1
解决办法
2万
查看次数

C#Stringbuilder在添加大量文本时损坏内容

我遇到了一个我无法解决的stringbuilder问题.为了简化问题,我创建了以下方法:

private static string TestBigStrings() {
  StringBuilder builder = new StringBuilder();

  for (int i = 1; i < 1500; i++) {
    string line = "This is a line isn't too big but breaks when we add to many of it.";
    builder.AppendLine(line);
  }

  return builder.ToString();
}
Run Code Online (Sandbox Code Playgroud)

它应该只添加该行1500次,然后将其组合成一个字符串并返回它.然而,不仅仅是组合它会腐蚀内容.在结果中间的某处你会找到文字:

This is a line isn't too big but breaks when we add to many of it. 
This is a line isn't too big but breaks when we add to many of it. 
This is …
Run Code Online (Sandbox Code Playgroud)

c# string stringbuilder corruption

5
推荐指数
1
解决办法
380
查看次数

什么是InplaceStringBuilder和StringBuilder之间的区别?

今天在VS2017 intellisense浮出水面InplaceStringBuilder时,我试图打字StringBuilder. InplaceStringBuilder对我来说是新的,所以我开始挖掘,看看我能学到什么.

我注意到的第一件事是它是一个结构而不是一个类,它的类型信息如下所示:

#region Assembly Microsoft.Extensions.Primitives, Version=1.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// C:\Users\Ron Clabo\Documents\Visual Studio 2017\Projects\wwwGiftOasisResponsive\packages\Microsoft.Extensions.Primitives.1.1.0\lib\netstandard1.0\Microsoft.Extensions.Primitives.dll
#endregion

using System.Diagnostics;

namespace Microsoft.Extensions.Primitives {
    [DebuggerDisplay("Value = {_value}")]
    public struct InplaceStringBuilder {
        public InplaceStringBuilder(int capacity);

        public int Capacity { get; set; }

        public void Append(string s);
        public void Append(char c);
        public override string ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

所以它有很多方法比StringBuilder.然后我google了解更多信息,InplaceStringBuilder但网上关于它的内容并不多,所以它看起来很新.

此外,我已经提到的差异,InplaceStringBuilder和之间有什么不同StringBuilder; 什么时候开发人员应该使用新的InplaceStringBuilder而不是旧的StringBuilder?

stringbuilder memory-management .net-core asp.net-core

5
推荐指数
2
解决办法
248
查看次数

仅在匹配阈值字节时才在地图中填充字符串值

我有一个tasks列表对象,我正在迭代并附加每个任务对象,StringBuilder然后是新行,如下所示.现在我将继续在同一个字符串生成器中追加任务对象,直到它达到60000字节的大小限制.一旦达到限制,我将填充此字符串作为映射中的值,键将是带增量索引的文件名.然后我将重置字符串构建器和其他东西并再次重复此过程.

因此,如果我有一个大tasks对象,那么我将拆分成多个字符串对象,其大小应始终小于60000字节.

我得到了下面的代码,但我总是看到地图中的值大小超过60000字节.我做错了什么?此外,我正在填写HashMap两个不同的地方 - 一个达到限制,另一个是如果没有达到限制.

  public void populate(final List<Task> tasks) {
    Map<String, String> holder = new HashMap<>();
    int size = 0;
    int index = 0;
    StringBuilder sb = new StringBuilder();
    for (Task task : tasks) {
      sb.append(task).append(System.getProperty("line.separator"));
      size = sb.toString().getBytes(StandardCharsets.UTF_8).length;
      if (size > 60000) {
        String fileName = "tasks_info_" + index + ".txt";
        holder.put(fileName, sb.toString());
        index++;
        sb = new StringBuilder();
        size = 0;
      }
    }
    // for cases where we don't reach …
Run Code Online (Sandbox Code Playgroud)

java algorithm stringbuilder utf-8 data-structures

5
推荐指数
1
解决办法
220
查看次数

如何用Java连接两个列表中的单词

我想根据两个不同列表中的单词创建一个句子。就像上面的例子:

“列表1w1列表2w1列表1w2列表2w2列表1w3列表2w3 ...”

我知道如何使用for循环,但是我想使用流。可能吗?

我当前的解决方案:

StringBuilder result = new StringBuilder();
for(int i=0; i<doses.size(); i++)
result.append(String.format("%s %s<br>", list1.get(i), list2.get(i)));
Run Code Online (Sandbox Code Playgroud)

java string stringbuilder list java-stream

5
推荐指数
0
解决办法
158
查看次数

初始化StringBuilder以使用UTF-16编码器

考虑一下Java 11中的以下代码:

StringBuilder sb = new StringBuilder("one");
sb.append("???");  // "two"
Run Code Online (Sandbox Code Playgroud)

第一行创建一个StringBuilder使用Latin1编码器的编码(每个字符一个字节)。然后,第二行使StringBuilder意识到它需要改用UTF16编码器,因此在附加新的UTF-16字符之前,它将其当前内容复制到新的数组中。

StringBuilder类的构造函数重载带有初始容量参数,如果您已经知道要构建的字符串的所需大小,则可以避免重新分配。但是,如果您以英语字符串开头,然后追加一个外部字符串,则此特殊的构造方法重载是无用的,因为它仍会重新分配字节数组。

有没有一种方法可以从一开始就创建使用UTF16的StringBuilder实例?

java stringbuilder java-11

5
推荐指数
1
解决办法
78
查看次数