[英]Removing characters from strings with LINQ
我正在嘗試通過編寫一些簡單的擴展方法來刷新我的LINQ。 有沒有更好的方法來編寫如下函數從字符串中刪除給定的字符列表(使用LINQ)?
它幫助我思考LINQ首先依賴的擴展方法:
public static string Remove(this string s, IEnumerable<char> chars)
{
string removeChars = string.Concat(chars);
return new string(s.ToCharArray().Where(c => !removeChars.Contains(c)).ToArray());
}
但那很難看。 Ergo LINQ。
我在LINQ語句中注意到的差異是我必須使用'select'而使用擴展方法,我不必這樣做。
/// <summary>Strip characters out of a string.</summary>
/// <param name="chars">The characters to remove.</param>
public static string Remove(this string s, IEnumerable<char> chars)
{
string removeChars = string.Concat(chars);
var stripped = from c in s.ToCharArray()
where !removeChars.Contains(c)
select c;
return new string(stripped.ToArray());
}
所以我想知道這個(上面的最后一個片段)是否是用於完成字符刪除的最簡潔的LINQ語句。
我更喜歡第一種形式的擴展方法,雖然簡化為
public static string Remove(this string s, IEnumerable<char> chars)
{
return new string(s.Where(c => !chars.Contains(c)).ToArray());
}
至於select關鍵字,它是第二種形式的強制性。 文檔說明“查詢表達式必須以select子句或group子句終止”。 這就是為什么我會避免使用LINQ語法糖。
試試這個簡潔
public static string Remove(this string source, IEnumerable<char> chars) {
return new String(source.Where(x => !chars.Contains(x)).ToArray());
}
編輯
更新以更正從源中刪除重復項
就個人而言,我傾向於使用非關系情境的第一種語法。 當我需要執行關系操作(連接)時,比如表達式樹對SQL,我使用后者。 但是,這只是因為它對我使用SQL有一段時間更具可讀性。
使用stringBuilder而不是新字符串時,性能會有所提高。 以下結果為:
StringBuilder 00:00:13.9930633 new String 00:00:15.1495309
string s = "ababababajjjaazsiajjsoajiojsioajlmmzaaokpdahgffaiojsia";
var sw = new Stopwatch();
sw.Start();
var toRemove = new char[] { 'j', 'a', 'z' };
for (int i = 0; i < 1000000; i++)
{
StringBuilder sb = new StringBuilder(s.Length, s.Length);
foreach (var c in s) if (!toRemove.Contains(c)) sb.Append(c);
}
Console.WriteLine("StringBuilder " + sw.Elapsed);
sw.Restart();
for (int i = 0; i < 1000000; i++)
{
new string(s.Where(c => !toRemove.Contains(c)).ToArray());
}
Console.WriteLine("new String " + sw.Elapsed);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.