Deci, de ce n-ar trebui să se întoarcă la prima apariție a "amâna"? Pentru că mai târziu, în secvența vezi același cuvânt "amâne" din nou. De ce ai reveni la prima apariție a "accesa"? Pentru că mai târziu, în secvența tu nu vezi acest cuvânt mai.
Deci: returna un cuvânt, dacă restul de secvență nu are acest cuvânt.
Acest lucru ar fi ușor în LINQ, cu recursivitate, dar nu este foarte eficient: pentru fiecare cuvânt ar trebui să verificați restul de secvență pentru a vedea dacă cuvântul este în repaus.
Ar fi mult mai eficient să-ți amintești cel mai mare indice pe care ai găsit un cuvânt.
Ca o metodă de prelungire. Dacă nu sunteți familiarizați cu metodele de extensie, vezi metode de extensie demistificat.
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);
}
Deci, pentru fiecare element din sursa secvență, vom verifica dacă este în dicționar. Dacă nu, vom adăuga elementul cheie în dicționar. Valoarea indicelui.
Dacă acesta este deja în dicționar, atunci valoarea a fost cel mai mare indice de unde am găsit acest articol înainte. Se pare că indicele curent este mai mare, deci vom înlocui valoarea în dicționar.
În cele din urmă am comanda perechi de valori-cheie în dicționarul de ascendent valoare, și să se întoarcă doar tastele.