我不能使用HashSet,因为我仍然需要枚举。如果你想知道为什么我需要这个,这就是原因:
private List<Point> sanitize(List<Point> crossPoints) {
HashSet<int> indexesToDelete = new HashSet<int>();
for (int i = 0; i < crossPoints.Count(); i++) {
if ((crossPoints[i].X - crossPoints[i + 1].X) <= 4) {
indexesToDelete.Add(i);
indexesToDelete.Add(i + 1);
}
}
for (int i = 0; i < crossPoints.Count(); i++) {
if ((crossPoints[i].Y - crossPoints[i + 1].Y) <= 4) {
indexesToDelete.Add(i);
indexesToDelete.Add(i + 1);
}
}
for (int i = 0; i < indexesToDelete.Count; i++) {
crossPoints.RemoveAt(indexesToDelete[i]);
}
return crossPoints;
}
由于indexesToDelete[i]
答案 0 :(得分:0)
如果你想迭代HashSet
,你可以这样做:
foreach(int i in indexesToDelete)
{
...
但是当你用RemoveAt
删除项目时要小心!如果您没有删除最后一个条目,则会移动其他一些项目,从而获得新索引。
执行此操作的一种方法是对索引进行排序并从最高索引到最低索引中删除项目。
var indexes = indexesToDelete.OrderByDescending(x => x).ToList();
foreach (int i in indexes)
{
crossPoints.RemoveAt(i);
}
您也可以使用SortedSet
代替HashSet
。
SortedSet<int> indexesToDelete = new SortedSet<int>();
...
foreach(int i in indexesToDelete.Reverse())
{
crossPoints.RemoveAt(i);
}
答案 1 :(得分:0)
有一个OrderedDictionary Class;但是,它不是通用的。 SortedDictionary<TKey, TValue>
Class是通用的。注意orderd和sorted之间的区别。有序意味着您的插入顺序保持不变。 Sorted意味着忽略插入顺序以支持排序顺序。