簡體   English   中英

將字符串C#中的字符分組的有效方法

[英]Efficient way of grouping characters in string c#

我想要一種有效的方式來對字符串進行分組,同時保持重復和順序。 像這樣

1100110002200   -> 101020

我以前嘗試過

_case.GroupBy(c => c).Select(g => g.Key)

但是我有102

但這給了我我想要的,我只是想對其進行優化,所以我不必每次都遍歷整個列表

static List<char> group(string _case)
{
    var groups = new List<char>();
    for (int i = 0; i < _case.Length; i++)
    {
        if (groups.LastOrDefault() != _case[i])
            groups.Add(_case[i]);
    }
    return groups;
}

您可以創建一個循環每個字符並檢查前一個字符是否相等的方法。 如果它們不相同,則append / yield返回字符。 使用Linq可以很容易地做到這一點。

public static string Simplify(string str)
{
    return string.Concat(str.Where((c, i) => i == 0 || c != str[i - 1]));
}

用法:

string simplified = Simplify("1100110002200");
// 101020

在我的測試中,我的方法和您的方法在速度上大致相同,在執行一千萬次之后(4260ms與4241ms),我的方法的速度明顯降低。

但是,我的方法以字符串形式返回結果,而您的則不是。 如果您需要將結果轉換回字符串(可能的話),那么我的方法的確確實更快/更高效(4260ms vs 6569ms)。

雖然我喜歡rshepp的優雅解決方案,但事實證明,非常基本的代碼運行速度甚至可以比后者快5倍。

public static string Simplify2(string str)
{
    if (string.IsNullOrEmpty(str)) { return str; }

    StringBuilder sb = new StringBuilder();
    char last = str[0];
    sb.Append(last);

    foreach (char c in str)
    {
        if (last != c)
        {
            sb.Append(c);
            last = c;
        }
    }

    return sb.ToString();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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