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