簡體   English   中英

使用LINQ從字符串中刪除字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM