我有一个列表:
A B B C D D D B E D
我想从列表中删除连续的重复项目以获取
A B C D B E D
如果我尝试Distinct()
,它只会给我A B C D E
答案 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)将指针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)