Tak prečo by nemal vrátite prvý výskyt "odložiť"? Pretože neskôr v poradí vidíte, to isté slovo "odložiť" znova. Prečo by ste vrátiť prvý výskyt "prístup"? Pretože neskôr v poradí nevidíte toto slovo už.
Takže: návrat slovo, ak zvyšok postupnosti nemá toto slovo.
To by bolo jednoduché, v LINQ, s rekurzie, ale to nie je veľmi efektívny: pre každé slovo, ktoré by ste mali skontrolovať, zvyšok postupnosti zistiť, či slovo je v pokoji.
To by bolo tak účinnejší, aby si najvyšší index, na ktorom ste našli slovo.
Ako rozšírenie metódy. Ak nie ste oboznámení s príponou metódy, pozri rozšírenie metódy demystified.
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);
}
Takže pre každý bod v zdrojovej postupnosti, sme skontrolovať, či je v slovníku. Ak nie, sme pridať položku ako kľúč do slovníka. Hodnota indexu.
Ak je už v slovníku, potom hodnota bol najvyšší index, kde sme našli táto položka predtým. Zrejme aktuálneho indexu je vyššia, a tak sme sa nahradiť hodnotu v slovníku.
Konečne sme, aby kľúčové hodnoty páry v slovníku vzostupne hodnotu, a vrátiť sa iba kľúče.