所以我的代码基本上是这样的:
List list = new List(new int [] {1,5,8,8,8,2,3,3,4,}); list = RemoveDuplicats(list);
public static List<int> RemoveDuplicats(List<int> list)
{
int i = 0;
while (i<list.Count)
{
if (list[i] == list[i+1])
{
list.RemoveAt(list[i + 1]);
return list;
}
i++;
}
return list;
}
似乎RemoveAt无法正常工作或完全被跳过。所以我应该得到的是1,5,8,2,3,4,但它只是打印原始列表。哪里出错了?
答案 0 :(得分:10)
使用Distinct IEnumerable扩展
List<int> list = new List<int>() { 1, 5, 8, 8, 8, 2, 3, 3, 4, };
list = list.Distinct().ToList();
使用默认值从序列中返回不同的元素 等于比较来比较值。
但是,这个解决方案的一部分在你的问题的许多重复中解释,我想解释你的错误。
您当前的代码无法正常工作,因为当您找到第一个副本时,您调用RemoveAt传递元素(8)的值,而不是要删除的元素的索引(2)as RemoveAt requires。你很幸运,这不会创建一个超出范围的例外。此外,您立即退出并返回其他重复项。
如果您仍想使用手工删除代码,可以尝试使用此
public List<int> RemoveDuplicats(List<int> list)
{
int i = 0;
List<int> distinctElements = new List<int>();
while (i < list.Count)
{
if (!distinctElements.Contains(list[i]))
distinctElements.Add(list[i]);
i++;
}
return distinctElements;
}
答案 1 :(得分:0)
我会使用distinct。
list.Distinct().ToList()