我的问题是: C#中的字符串连接是否安全?如果字符串连接导致意外错误,并且使用StringBuilder替换该字符串连接会导致这些错误消失,那可能表示什么?
背景:我正在开发一个小命令行C#应用程序.它接受命令行参数,执行稍微复杂的SQL查询,并将大约1300行数据输出到格式化的XML文件中.
我的初始程序总是在调试模式下正常运行.但是,在发布模式下,它将获得大约第750个SQL结果,然后因错误而死亡.错误是无法读取某一列数据,即使通过SqlDataReader对象的Read()方法刚刚返回true也是如此.
通过对代码中的所有操作使用StringBuilder来修复此问题,之前已经存在"string1 + string2".我不是在谈论SQL查询循环中的字符串连接,其中StringBuilder已经在使用中.我在谈论代码中较早的两个或三个短字符串变量之间的简单连接.
我的印象是C#足够聪明,可以通过添加几个字符串来处理内存管理.我错了吗?或者这是否表明其他一些代码问题?
当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.任何人都可以帮我理解行为吗?
考虑以下输入:
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是我能想到的最好的方法.
任何建议或意见将不胜感激.
我试图创建一个回文检查器.我正在使用StringBuilder,我发现附加空格有点棘手.
当单词没有空格时,此代码有效:
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迭代所有字符的标准方法是什么?
显而易见的路线是将其转换为String然后使用toCharArray().问题是,我正在处理成千上万个独特的字符串,我做了大量的追加,我认为我必须实施内存和性能问题.
编辑:为了澄清,我不是手动实习字符串,但我的理解是,他们会自动实习,那如果我叫toString了一个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) 今天在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?
我有一个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) 我想根据两个不同列表中的单词创建一个句子。就像上面的例子:
“列表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 11中的以下代码:
StringBuilder sb = new StringBuilder("one");
sb.append("???"); // "two"
Run Code Online (Sandbox Code Playgroud)
第一行创建一个StringBuilder使用Latin1编码器的编码(每个字符一个字节)。然后,第二行使StringBuilder意识到它需要改用UTF16编码器,因此在附加新的UTF-16字符之前,它将其当前内容复制到新的数组中。
StringBuilder类的构造函数重载带有初始容量参数,如果您已经知道要构建的字符串的所需大小,则可以避免重新分配。但是,如果您以英语字符串开头,然后追加一个外部字符串,则此特殊的构造方法重载是无用的,因为它仍会重新分配字节数组。
有没有一种方法可以从一开始就创建使用UTF16的StringBuilder实例?
stringbuilder ×10
java ×7
string ×4
c# ×2
.net-core ×1
algorithm ×1
asp.net-core ×1
corruption ×1
iterator ×1
java-11 ×1
java-stream ×1
list ×1
loops ×1
null ×1
palindrome ×1
utf-8 ×1