Tak proč by neměla vrátí první výskyt "odložit"? Protože později v sekvenci uvidíte stejné slovo "odložit" znovu. Proč by vás vrátí první výskyt "přístup"? Protože později v pořadí nevidíte toto slovo už.
Takže: vrátit slovo, pokud zbytek sekvence nemá toto slovo.
To by bylo snadné v LINQ, s rekurze, ale to není moc účinné: pro každé slovo, které budete muset zkontrolovat, zbytek sekvence, zda slovo je v klidu.
To by bylo mnohem efektivnější, aby vzpomenout na nejvyšší index, na kterém jste našli slovo.
Jako způsob rozšíření. Pokud nejste obeznámeni s příponou metody, viz rozšíření metody mýtů zbavená.
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 pro každou položku ve zdrojovém sekvence, můžeme zkontrolovat, pokud to je ve slovníku. Pokud ne, musíme přidat položky jako klíč slovníku. Hodnota je index.
Pokud je již ve slovníku, pak je hodnota nejvyššího indexu, kde jsme našli tento produkt předtím. Zdá se, že současný index je vyšší, takže jsme nahradit hodnotu ve slovníku.
Nakonec jsme se objednat dvojice klíč-hodnota ve slovníku vzestupně podle hodnoty, a vrátit se pouze klíče.