Существует множество способов решить эту проблему; Я предлагаю вам разбить его на ряд более мелких проблем, а затем написать простой метод, который решает каждую проблему.
Вот более простая проблема: учитывая последовательность T
, верните мне последовательность T
с удаленными «удвоенными» элементами:
public static IEnumerable<T> RemoveDoubles<T>(
this IEnumerable<T> items)
{
T previous = default(T);
bool first = true;
foreach(T item in items)
{
if (first || !item.Equals(previous)) yield return item;
previous = item;
first = false;
}
}
Отлично. Как это полезно? Потому что решение вашей проблемы сейчас:
int count = myList.Select(x => x > 2).RemoveDoubles().Count(x => x);
Следуйте.
Если у вас myList
как {0, 0, 3, 3, 4, 0, 4, 4, 4}
, то результат Select
будет {false, false, true, true, true, false, true, true, true}
.
Результат RemoveDoubles
равен {false, true, false, true}
.
Результат Count
равен 2, что является желаемым результатом.
Старайтесь использовать готовые детали, когда можете. Если вы не можете, попробуйте решить простую общую задачу , которая даст вам то, что вам нужно; теперь у вас есть инструмент, который вы можете использовать для других задач, требующих удаления дубликатов в последовательности.