是否有一个数据结构,如没有重复的列表,仍然允许索引?

时间:2013-12-22 00:45:01

标签: c# data-structures

我不能使用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]

,因此无法编译

2 个答案:

答案 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意味着忽略插入顺序以支持排序顺序。