c# - 用设定值替换连续重复,但前提是连续范围的长度超过阈值
问题描述
将列表元素中的连续相同值替换为另一个给定值的有效方法是什么,但前提是连续序列运行超过一定数量的元素(例如:大于或等于 5)
例子:
[“红色的”; “红色的”; “蓝色的”; “绿色”; “绿色”; “红色的”; “红色的” ; “红色的”; “红色的”; “红色的”; “红色的”; “黄色”; “白色的”; “白色的”; “红色的”; “白色的”; “白色的”]
应该变成:
[“红色的”; “红色的”; “蓝色的”; “绿色”; “绿色”; “忽视”; “忽视” ; “忽视”; “忽视”; “忽视”; “忽视”; “黄色”; “白色的”; “白色的”; “红色的”; “白色的”; “白色的”]
任何想法?
解决方案
正如评论中所说,使用GroupAdjacent
nuget 包对连续重复进行分组MoreLinq
是一种选择:
var strings = new List<string> { "red", "red", "blue", "green", "green", "red", "red", "red", "red", "red", "red", "yellow", "white", "white", "red", "white", "white" };
var result = strings
.GroupAdjacent(x => x)
.SelectMany(grp => (grp.Count() >= 5) ?
grp.Select(x => "ignore") :
grp);
Console.WriteLine("{ " + string.Join(", ", result) + " }");
结果:
{ red, red, blue, green, green, ignore, ignore, ignore, ignore, ignore, ignore, yellow, white, white, red, white, white }
上面还使用将分组序列Enumerable.SelectMany
展平为 a ,然后使用三元运算符来决定如果组长度 from大于或等于 5 ,是否应该将组完全替换为with ,或者保持原样。IEnumerable<IEnumerable<string>>
IEnumerable<string>
"ignore"
Enumerable.Select
Enumerable.Count
推荐阅读
- r - 当我使用 as.dendrogram 时,叶子的标签没有完全显示
- c# - Windows 窗体应用程序中的开始位置属性
- reactjs - 使用useReducer时如何避免耦合?
- php - 如何使用 call_user_func 调用全局函数?
- java - 将 UTC 转换为 EST 时区
- javascript - 如何使用当前脚本应用自定义映射
- ios - 如何创建抽象函数以减少代码重复
- datetime - 日期转换处理 YYYY-MM-DD HH:MM:SS.SSS
- linux - 如何让linux机器在固定的时间内关闭
- java - 如何修复 Mockito 抛出“嵌套异常是 java.lang.NullPointerException”?