2016-02-11 3 views

ответ

5

Итерация над списком запоминает предыдущий элемент, если ток равен предыдущему, игнорировать его, иначе добавить в список.

+6

Этого это просто комментарий ИМО. – HimBromBeere

+2

@ Хим нет, это не так. Нигде не указано, что ответ должен содержать код для копирования. Этот ответ описывает алоризм, который работает, зависит от того, хотят ли они его реализовать. – CodeCaster

+2

Это в значительной степени то, что вам нужно сделать, хотя и достаточно для меня. – Carra

1

Вы можете попробовать что-то вроде:

public static void removeAdjacentDuplicates<T>(this List<T> List, IComparer<T> Comparer) 
{ 
    int unique = 0; 
    for (int i = 0; i < List.Count; i++) 
     if ((i == 0) || (Comparer.Compare(List[unique - 1], List[i]) != 0)) 
      List[unique++] = List[i]; 
    List.RemoveRange(unique, List.Count - unique); 
} 

(Это, по существу, что сказал @Salvador Дали) -
Удаление в диапазоне unique к List.Count - unique должны получить, что вы хотите.

0

Вы можете сделать это на месте.

1) Держите указатель i и j, указывая в начале. Теперь увеличьте указатель j до последующих элементов до тех пор, пока не найдет другой элемент (отличный от того, на который указывает i).

A A B B B C D D 
^^^ 
i j j //(j increasing, stopped at B) 

2) Как только будет найден другой элемент, сделайте arr[++i] = arr[j];. То есть, копирование нового элемента на следующую позицию i.

A B B B B C D D 
^^ 
    i j 

3) Теперь перезапустите процесс. А теперь увеличьте j как на первом шаге и повторите.

A B B B B C D D 
^^^^^
    i j j j j //(j increasing, stopped at C) 
2

Если вы хотите новая коллекция (первоначальный список сохранился нетронутым):

// not necessary a list 
    IEnumerable<String> source = "A B B C D D D B E D".Split(' '); 

    String last = null; 

    var result = source.Where((item, index) => { 
    var value = index == 0 || item != last; 
    last = item; 

    return value; 
    }); 

    // "A B C D B E D" 
    Console.Write(String.Join(" ", result)); 

В случае, если вы хотите, чтобы удалить элементы в существующего списка:

List<String> list = "A B B C D D D B E D".Split(' ').ToList(); 

    for (int i = list.Count - 1; i >= 1; --i) 
    if (list[i] == list[i - 1]) 
     list.RemoveAt(i); 

    // "A B C D B E D" 
    Console.Write(String.Join(" ", list)); 
Смежные вопросы