Więc dlaczego nie można odzyskać pierwsze pojawienie się "odłożyć"? Bo później w tej sekwencji można ponownie zobaczyć to samo słowo "odłożyć". Po co zwracać pierwsze wystąpienie "dostępu"? Bo później w kolejności już nie patrz na to słowo.
Tak więc: oddajcie słowo, jeśli w pozostałej części sekwencji tego słowa nie ma.
To byłoby łatwe w LINQ z rekursji, ale nie jest to bardzo skutecznie: dla każdego słowa trzeba sprawdzać resztę sekwencji, aby zobaczyć, czy są jakieś słowo w pozostałych.
Byłoby znacznie lepiej zapamiętać najwyższy wskaźnik, według którego znalazłeś słowo.
Jako metodę rozszerzenia. Jeśli nie jesteś zaznajomiony z metodami dany, patrz Metody rozszerzenia, ujawnionych.
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);
}
Dlatego dla każdego elementu w oryginalnej kolejności sprawdzamy, czy jest on w słowniku. Jeśli nie, możemy dodać element jako klucz w słowniku. Wartość - jest to wskaźnik.
Jeśli już istnieje w słowniku znaczenie było najwyższym wskaźnikiem tego, gdzie znajdowaliśmy ten element wcześniej. Oczywiście, aktualny indeks wyżej, więc zamieniamy wartość w słowniku.
W końcu, my porządkujemy pary wartości kluczy w słowniku rosnąco i zwracamy tylko klucze.