Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串c中字符分组的有效方法#_C#_Linq_Grouping - Fatal编程技术网

C# 字符串c中字符分组的有效方法#

C# 字符串c中字符分组的有效方法#,c#,linq,grouping,C#,Linq,Grouping,我想要一种有效的方法来分组字符串,同时保持重复项和顺序。 像这样的 1100110002200 -> 101020 我以前试过这个 _case.GroupBy(c => c).Select(g => g.Key) 但我得了102分 但这给了我想要的,我只是想优化它,这样我就不必每次都搜索整个列表 static List<char> group(string _case) { var groups = new List<char>();

我想要一种有效的方法来分组字符串,同时保持重复项和顺序。 像这样的

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;
}
静态列表组(字符串大小写)
{
变量组=新列表();
对于(int i=0;i<\u case.Length;i++)
{
if(groups.LastOrDefault()!=\u case[i])
添加(_案例[i]);
}
返回组;
}

您可以创建一个方法,循环每个字符并检查前一个字符是否相等。如果它们不相同,则追加/返回字符。这对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
在我的测试中,我的方法和你的方法在速度上大致相同,我的方法在1000万次执行后(4260毫秒对4241毫秒)的速度稍慢


但是,我的方法会以字符串形式返回结果,而你的方法不会。如果您需要将结果转换回字符串(很可能),那么我的方法确实更快/更有效(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();
}

这似乎更适合,因为您有需要改进的工作代码,但一定要检查“每次搜索整个列表”是什么意思?(注意:.)它与GroupBy/Select/LINQ的“冲刷”有什么区别?@CamiloTerevinto谢谢,我马上会查一下away@jdweng但这并不是他想要的。@jdweng是的,我是。他想获得
1100110002200
并获得
101020
。GroupBy不会这样做,因为它会占用所有的1并创建一个组,另一个组用于0,另一个组用于2,等等。