C# LINQ. Оставить последнее значение после Disticnt()

List<string> list = new List<string>();
list.Add("Water");
list.Add("John");
list.Add("Drinks");
list.Add("Water");

List<string> b = new List<string>();
b.AddRange(list.Distinct());

После обработки выходит результат Water John Drinks, а нужно John Drinks Water. Я хочу чтобы Джон Пил воду, а не чтобы Водный Джон Пил)

Сортировка листа - не вариант, лист должен выводить элементы в том порядке, в котором вошли.


Ответы (1 шт):

Автор решения: A K

жаль пока доступа к коду не имею, но мне пришла мысль попробовать перевернуть лист, провести distinct и перевернуть обратно

Гм, ну вроде работает как запрашивали, да:

private static List<string> LastDup(List<string> list)
{
    var copy = list; // Не будем модифицировать/портить входные данные
    
    copy.Reverse();

    var result = new List<string>();
    result.AddRange(list.Distinct());

    result.Reverse();

    return result;
}

Но мне всё же нравится больше простой вариант за проход list в один обход:

private static List<string> LastDup(List<string> list)
{
   var result = new List<string>();

   foreach (var element in list)
   {
       if (result.Contains(element))
       {
           result.Remove(element);
       }

       result.Add(element);
   }

   return result;
}
→ Ссылка