首页 > 解决方案 > 用设定值替换连续重复,但前提是连续范围的长度超过阈值

问题描述

将列表元素中的连续相同值替换为另一个给定值的有效方法是什么,但前提是连续序列运行超过一定数量的元素(例如:大于或等于 5)

例子:

[“红色的”; “红色的”; “蓝色的”; “绿色”; “绿色”; “红色的”; “红色的” ; “红色的”; “红色的”; “红色的”; “红色的”; “黄色”; “白色的”; “白色的”; “红色的”; “白色的”; “白色的”]

应该变成:

[“红色的”; “红色的”; “蓝色的”; “绿色”; “绿色”; “忽视”; “忽视” ; “忽视”; “忽视”; “忽视”; “忽视”; “黄色”; “白色的”; “白色的”; “红色的”; “白色的”; “白色的”]

任何想法?

标签: c#arrayslistduplicatescontiguous

解决方案


正如评论中所说,使用GroupAdjacentnuget 包对连续重复进行分组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.SelectEnumerable.Count


推荐阅读