Так почему бы вам не вернуть первое появление "отложить"? Потому что позже в этой последовательности вы снова увидите то же самое слово "отложить". Зачем вам возвращать первое вхождение "доступа"? Потому что позже в последовательности вы больше не видите это слово.
Итак: верните слово, если в остальной части последовательности этого слова нет.
Это было бы легко в LINQ с рекурсией, но это не очень эффективно: для каждого слова вам придется проверять остальную часть последовательности, чтобы увидеть, есть ли слово в остальных.
Было бы гораздо эффективнее запомнить самый высокий индекс, по которому вы нашли слово.
В качестве метода расширения. Если вы не знакомы с методами расширения, см. раздел Методы расширения, разглашенные.
private static IEnumerable<T> FindLastOccurences<T>(this IEnumerable<T> source)
{
return FindLastOccurrences<T>(source, null);
}
private static IEnumerable<T> FindLastOccurences<T>(this IEnumerable<T> source,
IEqualityComparer<T> comparer)
{
// TODO: check source not null
if (comparer == null) comparer = EqualityComparer<T>.Default;
Dictionary<T, int> dictionary = new Dictionary<T, int>(comparer);
int index = 0;
foreach (T item in source)
{
// did we already see this T? = is this in the dictionary
if (dictionary.TryGetValue(item, out int highestIndex))
{
// we already saw it at index highestIndex.
dictionary[item] = index;
}
else
{
// it is not in the dictionary, we never saw this item.
dictionary.Add(item, index);
}
++index;
}
// return the keys after sorting by value (which contains the highest index)
return dictionay.OrderBy(keyValuePair => keyValuePair.Value)
.Select(keyValuePair => keyValuePair.Key);
}
Поэтому для каждого элемента в исходной последовательности мы проверяем, есть ли он в словаре. Если нет, мы добавим элемент в качестве ключа в словарь. Значение - это индекс.
Если он уже есть в словаре, то значение было самым высоким показателем того, где мы находили этот элемент раньше. Очевидно, текущий индекс выше, поэтому мы заменяем значение в словаре.
Наконец, мы упорядочиваем пары значений ключей в словаре по возрастанию и возвращаем только ключи.