如何从列表中删除连续的重复项目

时间:2016-02-11 07:57:46

标签: c# algorithm linq list

我有一个列表:

  A  B B  C D D D B E D

我想从列表中删除连续的重复项目以获取

  A  B C D B E D 

如果我尝试Distinct(),它只会给我A B C D E

4 个答案:

答案 0 :(得分:5)

迭代列表记住前一个元素,如果当前等于前一个元素,则忽略它,否则添加到列表中。

答案 1 :(得分: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));

答案 2 :(得分:1)

您可以尝试以下内容:


    $A='E';
    $B='F';
    $C='D';
    $var = ['A'=> $A, 'B' => $B, 'C' => $C];
    $string = '{';
    foreach ($var as $key => $value){
        $string .= $key.':'.$value.', ';
    }
    $string .= '}';
    echo $string;

(这基本上是@Salvador Dali所说的) -
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); } unique范围内删除可以获得您想要的效果。

答案 3 :(得分:0)

您可以在现场执行此操作。

1)将指针ij指向开头。现在将指针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)