2015-10-20 124 views
2

序列中假设我们有对象删除重复的连续对象

List<int> list = new List<int>() { 1,1,1,2,3,3,3,2,2,2,1,1 }; 

什么是最优雅的方式来得到以下结果列表清单?

{1,2,3,2,1} 
+0

假设您的列表包含您可以使用的基本类型[Distinct()](https://msdn.microsof t.com/en-us/library/vstudio/bb348436(v=vs.100).aspx)。例如:'list.Distinct()。ToList();'。如果您的列表中包含复杂类型,则需要将其传递给您的类型实现的“IEqualityComparer” – DGibbs

+6

@sstan请阅读我的问题bettera并删除“标记为重复”或提供有效答案 – Alex

+0

您期望的结果{1,2 ,3,2,1}'不符合你的要求'删除对象序列中的重复项,这会根据你的数据集给出'1,2,3'的结果。 – DGibbs

回答

2

试试这个:

List<int> newList = new List<int>(); 
foreach (var item in list.Where(c => newList.Count == 0 || newList.Last() != c)) 
{ 
    newList.Add(item); // 1,2,3,2,1 will add to newList 
} 
4

我喜欢的扩展方法的想法:

public static IEnumerable<T> RemoveContiguousDuplicates<T>(this IEnumerable<T> items) where T: IEquatable<T> 
{ 
    bool init = false; 
    T prev = default(T); 

    foreach (T item in items) 
    { 
     if (!init) 
      init = true; 
     else if (prev.Equals(item)) 
      continue; 

     prev = item; 
     yield return item; 
    } 
} 

然后,当然,要使用它:

var singles = list.RemoveContiguousDuplicates().ToList();