容器去重是工程中经常用到的轮子。如果用C#3.0的话,直接用System.Linq.Enumerable中的Distinct方法即可搞定。该方法底层是通过构造一个DistinctIterator的延迟迭代器来实现输出时的伪装去重。
如果是C#2.0中则需要自己手工去做。
算法的基本思想是:从后向前扫描,每次确认已经扫描过的区域内是否有重复元素,如果发现重复元素则删除后面的元素。该算法可以避免从前向后扫描即时删除时维护下标的复杂性,当然将要删除的元素下标记到RemoveList是另外一种解法。
public static Unique<T>(List<T> list)
{
if(list == null)
return;
for(int i = list.Count - 1; i>= 0; i--)
{
for(int j = list.Count - 1; j > i; j--)
{
if(list[i] == null && list[j] == null
|| list[i].Equals(list[j]))
{
list.RemoveAt(j);
}
}
}
}
当然在C++中也是有现成的轮子可以用的,STL中的unique和unique_copy很适合用来干这种勾当。
评论