Заменить смежные дубликаты на заданное значение, но только если длина смежного диапазона больше порога - PullRequest
0 голосов
/ 25 июня 2019

Какой эффективный способ заменить смежные идентичные значения в элементах списка другим заданным значением, но только если непрерывная последовательность выполняется для более чем определенного количества элементов (например, больше или равно 5)

Пример:

["red";«Красный»;«Синий»;«Зеленый»;«Зеленый»; "красный";"красный";«Красный»;«Красный»;«Красный»;"красный";"желтый";«Белый»;«Белый»;«Красный»;«Белый»;«белый»]

должен стать:

[«красный»;«Красный»;«Синий»;«Зеленый»;«Зеленый»; "игнорировать";"игнорировать";«Игнорировать»;«Игнорировать»;«Игнорировать»;"ignore";"yellow";«Белый»;«Белый»;«Красный»;«Белый»;"белый"]

Есть идеи?

1 Ответ

3 голосов
/ 25 июня 2019

Как сказано в комментариях, использование 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, чтобы объединить сгруппированную последовательность IEnumerable<IEnumerable<string>> в IEnumerable<string>, а затем троичный оператор, чтобы решить, должна ли группа быть полностьюзаменяется на "ignore" на Enumerable.Select, если длина группы от Enumerable.Count больше или равна 5 , либо оставлена ​​как есть.

...