gpt4 book ai didi

c# - 清洁绳子?有没有更好的方法呢?

转载 作者:IT王子 更新时间:2023-10-29 04:29:05 25 4
gpt4 key购买 nike

我正在使用这种方法来清理字符串

public static string CleanString(string dirtyString)
{
string removeChars = " ?&^$#@!()+-,:;<>’\'-_*";
string result = dirtyString;

foreach (char c in removeChars)
{
result = result.Replace(c.ToString(), string.Empty);
}

return result;
}

此方法工作正常。但是此方法存在性能故障。每次我传递字符串时,每个字符都会进入循环,如果我有一个大字符串,那么返回对象会花费太多时间。

有没有其他更好的方法来做同样的事情?就像在 LINQ 或 JQUERY/Javascript 中一样

如有任何建议,我们将不胜感激。

最佳答案

好的,考虑下面的测试:

public class CleanString
{
//by MSDN http://msdn.microsoft.com/en-us/library/844skk0h(v=vs.71).aspx
public static string UseRegex(string strIn)
{
// Replace invalid characters with empty strings.
return Regex.Replace(strIn, @"[^\w\.@-]", "");
}

// by Paolo Tedesco
public static String UseStringBuilder(string strIn)
{
const string removeChars = " ?&^$#@!()+-,:;<>’\'-_*";
// specify capacity of StringBuilder to avoid resizing
StringBuilder sb = new StringBuilder(strIn.Length);
foreach (char x in strIn.Where(c => !removeChars.Contains(c)))
{
sb.Append(x);
}
return sb.ToString();
}

// by Paolo Tedesco, but using a HashSet
public static String UseStringBuilderWithHashSet(string strIn)
{
var hashSet = new HashSet<char>(" ?&^$#@!()+-,:;<>’\'-_*");
// specify capacity of StringBuilder to avoid resizing
StringBuilder sb = new StringBuilder(strIn.Length);
foreach (char x in strIn.Where(c => !hashSet.Contains(c)))
{
sb.Append(x);
}
return sb.ToString();
}

// by SteveDog
public static string UseStringBuilderWithHashSet2(string dirtyString)
{
HashSet<char> removeChars = new HashSet<char>(" ?&^$#@!()+-,:;<>’\'-_*");
StringBuilder result = new StringBuilder(dirtyString.Length);
foreach (char c in dirtyString)
if (removeChars.Contains(c))
result.Append(c);
return result.ToString();
}

// original by patel.milanb
public static string UseReplace(string dirtyString)
{
string removeChars = " ?&^$#@!()+-,:;<>’\'-_*";
string result = dirtyString;

foreach (char c in removeChars)
{
result = result.Replace(c.ToString(), string.Empty);
}

return result;
}

// by L.B
public static string UseWhere(string dirtyString)
{
return new String(dirtyString.Where(Char.IsLetterOrDigit).ToArray());
}
}

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
var dirtyString = "sdfdf.dsf8908()=(=(sadfJJLef@ssyd€sdöf////fj()=/§(§&/(\"&sdfdf.dsf8908()=(=(sadfJJLef@ssyd€sdöf////fj()=/§(§&/(\"&sdfdf.dsf8908()=(=(sadfJJLef@ssyd€sdöf";
var sw = new Stopwatch();

var iterations = 50000;

sw.Start();
for (var i = 0; i < iterations; i++)
CleanString.<SomeMethod>(dirtyString);
sw.Stop();
Debug.WriteLine("CleanString.<SomeMethod>: " + sw.ElapsedMilliseconds.ToString());
sw.Reset();

....
<repeat>
....
}
}

输出

CleanString.UseReplace: 791
CleanString.UseStringBuilder: 2805
CleanString.UseStringBuilderWithHashSet: 521
CleanString.UseStringBuilderWithHashSet2: 331
CleanString.UseRegex: 1700
CleanString.UseWhere: 233

结论

使用哪种方法可能无关紧要。

当连续调用 50000(!) 次时,禁食(UseWhere:233ms)和最慢(UseStringBuilder:2805ms)方法之间的时间差为 2572ms .如果不经常运行该方法,您可能不需要关心它。

但是如果你这样做,使用UseWhere方法(L.B写的);但也要注意它略有不同。

关于c# - 清洁绳子?有没有更好的方法呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11395775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com