Я думаю, что это самое простое, что можно получить с помощью Linq:
colors.Where((color, i) => i == 0 || color != colors[i - 1]);
Вы можете попробовать это в C # Интерактив:
> var colors = new[] { "red", "red", "blue", "green", "green", "red", "red", "yellow", "white", "white", "red", "white", "white" };
> colors.Where((color, i) => i == 0 || color != colors[i - 1])
WhereIterator { "red", "blue", "green", "red", "yellow", "white", "red", "white" }
Хитрость здесь в том, чтобы использовать перегрузку Where (), которая принимает предикат с индексом, а затем сравнивать с предыдущим элементом в исходном массиве.