【发布时间】:2015-08-30 02:52:40
【问题描述】:
关于如何从另一个列表中排除一个列表中的项目,我有一个相当具体的问题。常见的方法,例如 except() 不会这样做,原因如下:
- 如果列表中的重复项具有“偶数”索引 - 我需要删除 THIS 元素和它之后的 NEXT 元素。
- 如果列表中的重复项具有“奇数”索引 - 我需要删除此元素和一个元素之前**它。
- 在一个列表中可能会出现多次相同的重复项。即一个可能是“奇数”索引,另一个可能是“偶数”。
我不是在寻求解决方案,因为我自己创建了一个。然而,在多次执行此方法后 - “ANTS 性能分析器”显示该方法经过了整个执行时间的 75%(40 秒中的 30 秒)。问题是:是否有更快的方法来执行相同的操作?我已经尝试优化我当前的代码,但它仍然缺乏性能。这里是:
private void removedoubles(List<int> exclude, List<int> listcopy)
{
for (int j = 0; j < exclude.Count(); j++)
{
for (int i = 0; i < listcopy.Count(); i++)
{
if (listcopy[i] == exclude[j])
{
if (i % 2 == 0) // even
{
//listcopy.RemoveRange(i, i + 1);
listcopy.RemoveAt(i);
listcopy.RemoveAt(i);
i = i - 1;
}
else //odd
{
//listcopy.RemoveRange(i - 1, i);
listcopy.RemoveAt(i - 1);
listcopy.RemoveAt(i - 1);
i = i - 2;
}
}
}
}
}
地点:
- 排除 - 仅包含重复项的列表。此列表最多可包含 30 个元素。
- listcopy - 应检查重复的列表。如果发现“排除”中的重复项 -> 执行删除操作。此列表最多可包含 2000 个元素。
我认为 LINQ 可能会有所帮助,但我不太了解它的语法。
【问题讨论】:
-
粗体和大写,在我看来太多尖叫了。
-
它是为了展示主要的想法。无论如何,编辑问题
-
AHHH - 永远不要永远在
for循环中更改循环变量!请改用 while 循环! -
您正在调用
Count()方法,它是 LINQ 的一部分。这可能比简单地使用Count属性要慢,该属性已经内置在List类中。
标签: c# winforms list optimization