我有一个方法来替换除我指定的字符之外的每个字符.例如,
ReplaceNot("test. stop; or, not", ".;/\\".ToCharArray(), '*');
Run Code Online (Sandbox Code Playgroud)
会回来的
"****.*****;***,****".
现在,这不是过早优化的实例.我在网络操作期间多次调用此方法.我发现在更长的字符串上,它会导致一些延迟,并且删除它会有所帮助.任何有助于加快这一点的帮助将不胜感激.
public static string ReplaceNot(this string original, char[] pattern, char replacement)
{
int index = 0;
int old = -1;
StringBuilder sb = new StringBuilder(original.Length);
while ((index = original.IndexOfAny(pattern, index)) > -1)
{
sb.Append(new string(replacement, index - old - 1));
sb.Append(original[index]);
old = index++;
}
if (original.Length - old > 1)
{
sb.Append(new string(replacement, original.Length - (old + 1)));
}
return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)
最后的#.我还为一个3K字符串添加了一个测试用例,运行时间为100K而不是1M,以查看每个字符串的大小.唯一令人惊讶的是,正则表达式"比其他表达式更好",但它没有任何帮助,因为它开始时非常缓慢:
User Short * 1M Long * 100K …
应该StringBuilder.Capacity设置为最大.NET字符数,而不考虑空终止,或者在使用P/Invoke时,必须将其设置为更高,以便为空终止符保留空间.
自然的反应是它应该设置得更高,但似乎P/Invoke应该自动补偿.事实上,这实际上是在这里记录的:http://msdn.microsoft.com/en-US/library/s9ts558h(v = VS.100).aspx
这个问题的原因是大多数示例与上述文档并不严格一致.它们几乎总是被编码:
StringBuilder sb = new StringBuilder(dotNetChars + 1);
SomeWindowsAPI(sb, sb.Capacity);
Run Code Online (Sandbox Code Playgroud)
代替:
StringBuilder sb = new StringBuilder(dotNetChars);
SomeWindowsAPI(sb, sb.Capacity + 1);
Run Code Online (Sandbox Code Playgroud)
(我意识到一些API处理缓冲区大小参数的方式不同.假设API处理这是必须的常见方式,如GetFullPathName:http://msdn.microsoft.com/en-us/library/aa364963(v = VS.85) .aspx)
sb.Capacity直接在API调用中使用表达式似乎是避免不匹配的最佳实践.问题是添加+1是否正确.
环视四周.您可能会发现唯一显示的sb.Capacity + 1是MSDN文档.
当然,人们可以在谨慎的情况下使用比绝对必要的更大的缓冲区来分配,但我想知道如何做到这一点的共识.
如果以下代码:
String s = "a" + 1 + "b";// 1.
Run Code Online (Sandbox Code Playgroud)
使用StringBuilder等效实现
String s = new StringBuilder().append("a").append(1).append("b");
Run Code Online (Sandbox Code Playgroud)
然后将在1中创建额外的对象"a"和"b",为什么?
我尝试着 :
1 string pal = "Juan 1David 1Correa";
2 StringBuilder sb = new StringBuilder(pal);
3 Console.writeline( sb.ToString(0,9) );
4 Console.writeline( sb.ToString(10,14) );
5 Console.writeline( sb.ToString(15,26) );
Run Code Online (Sandbox Code Playgroud)
但是在4行中它引发了异常.
为什么?
如何将空格附加到字符串生成器?我需要插入90个空格,在VB我有这个代码,但我很困惑如何写c#任何人可以帮助我
Dim S As New StringBuilder("HELLO")
S.Append(" "c, 90)
S.Append("WORLD")
MessageBox.Show(S.ToString)
Run Code Online (Sandbox Code Playgroud)
谢谢.
我在Java 1.6中编写了一个webapp并在tomcat中运行它.虽然我没有做任何明确的线程,但我想知道Spring和Tomcat幕后发生了什么.我会使用StringBuilder而不是StringBuffer遇到任何问题吗?
我有不同类型的名字.喜欢
ABC BCD, EFG HGF, HGF HJK
Run Code Online (Sandbox Code Playgroud)
我想,以取代过去,用"and".所以,格式将是这样的
ABC BCD, EFG HGF & HGF HJK
Run Code Online (Sandbox Code Playgroud)
我试过这个
names = "Jon Benda, Jon Wetchler, Thomas Leibig "
StringBuilder sbd = new StringBuilder();
String[] n = getNames.split("\\s+");
System.out.println(n.length);
for (int i = 0; i < n.length; i++) {
sbd.append(n[i]);
System.out.print(n[i]);
if (i < n.length - 3)
sbd.append(" ");
else if (i < n.length - 2)
sbd.append(" & ");
}
System.out.print("\n");
System.out.print(sbd);
Run Code Online (Sandbox Code Playgroud) 我需要使用这个方法,在查看源代码之后,我注意到一个StringBuilder不熟悉的初始化(我总是使用no-argument构造函数StringBuilder,ie new StringBuilder()).
在方法中:
StringBuilder sb = new StringBuilder(items.size() << 3);
Run Code Online (Sandbox Code Playgroud)
来自JavaDoc:
java.lang.StringBuilder.StringBuilder(int capacity)
构造一个字符串构建器,其中没有字符和capacity参数指定的初始容量.
为什么这里需要换班?
源代码:
/** Creates a backslash escaped string, joining all the items. */
public static String join(List<?> items, char separator) {
StringBuilder sb = new StringBuilder(items.size() << 3);
boolean first=true;
for (Object o : items) {
String item = o.toString();
if (first) {
first = false;
} else {
sb.append(separator);
}
for (int i=0; i<item.length(); i++) {
char …Run Code Online (Sandbox Code Playgroud) StringBuilder sb = "asd";
Run Code Online (Sandbox Code Playgroud)
在Java中,这种说法显然是错误的.像eclipse这样的IDE会告诉你:
无法从String转换为StringBuilder
但是,操作员String可以初始化对象=.
我想知道一些与内存分配有关的原因.
介绍
我有一个应用程序,并希望强制用户更新它,如果新版本在谷歌游戏市场.使用以下代码可以正常工作,但不是很稳定.我是通过AsyncTask进行的,并从php文件中获取数据.但它让我觉得必须有一种更好的方式或方式使它更稳定.
题
如何为程序设置超时,例如由于用户的互联网连接非常低?
码
get_newest_apk.php
<?PHP
/* GET APK VERSION FROM ANDROID DEVICE
Example: [PATH]/get_newest_apk.php?apkversion=6
*/
if($_GET["apkversion"]){
$apkversion= $_GET["apkversion"];
//MYSQL LOGIN PARAMETERS
$host = '*****';
$user = '*****';
$pass = '*****';
$db = '*****';
$mysqli = new mysqli($host, $user, $pass, $db);
$result = $mysqli->query("SELECT MAX(VERSION) FROM TBL_APK");
$row = $result->fetch_row();
$count = $row[0];
if($count > $apkversion){
//Newer APK is avaiable
echo "1";
}else{
//There is no never APK avaiable
echo "2";
}
}else{
//Error by GETTING apkversion from Android …Run Code Online (Sandbox Code Playgroud) stringbuilder ×10
java ×5
c# ×3
string ×2
.net ×1
android ×1
exception ×1
java-6 ×1
mysql ×1
performance ×1
php ×1
pinvoke ×1
stringbuffer ×1