Öyleyse neden ilk "ertele" olayını geri getirmiyorsunuz? Çünkü daha sonra sırayla aynı kelimeyi tekrar "ertele" yi görüyorsunuz. Neden "erişim" in ilk oluşumunu döndürürsünüz? Çünkü dizinin ilerleyen bölümlerinde artık bu kelimeyi görmüyorsunuz.
Yani: dizinin geri kalanında bu sözcük yoksa bir sözcük döndürün.
Bu, özyineleme ile lınq'da kolay olurdu, ancak çok verimli değil: her kelime için, kelimenin geri kalanında olup olmadığını görmek için dizinin geri kalanını kontrol etmeniz gerekir.
Üzerinde bir kelime bulduğunuz en yüksek dizini hatırlamak çok daha verimli olacaktır.
Uzatma yöntemi olarak. Eğer sen are değil bildik ile uzatma yöntemleri, görmek uzatma yöntemleri açıklığa kavuşturdu.
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);
}
Bu nedenle, kaynak dizisindeki her öğe için sözlükte olup olmadığını kontrol ederiz. Değilse, öğeyi sözlüğe anahtar olarak ekleriz. Değer endekstir.
Zaten sözlükte bulunuyorsa, değer daha önce bu öğeyi bulduğumuz yerin en yüksek diziniydi. Görünüşe göre mevcut endeks daha yüksek, bu yüzden sözlükteki değeri değiştiriyoruz.
Son olarak, sözlükteki anahtar değer çiftlerini artan değere göre sıralarız ve yalnızca anahtarları döndürürüz.