如何使函数压缩具有重复条目的数组?
例如!
一个函数,它将获取一个排序的整数数组并返回压缩的数组。也就是说,给定一个包含:1,2,6,8,8,8,9,10,10的数组,当函数返回时,数组的内容应为:1,2,6,8,9,10
这不是新闻。我正在尝试制作一个能够做到这一点的功能。
答案 0 :(得分:7)
怎么样:
array = array.Distinct().ToArray();
或作为功能:
private int[] RemoveDuplicates(int[] array)
{
return array.Distinct().ToArray();
}
然后用:
来调用它array = RemoveDuplicates(array);
答案 1 :(得分:2)
扩展方法:
public static T[] RemoveDuplicates<T>(this T[] array)
{
return array.Distinct().ToArray();
}
public static List<T> RemoveDuplicates<T>(this List<T> list)
{
return list.Distinct().ToList();
}
用于数组:
int[] array = new[] {1, 3, 4, 3};
array = array.RemoveDuplicates();
用于列表:
List<int> list = new List<int> {1, 3, 4, 3};
list = list.RemoveDuplicates();
答案 2 :(得分:1)
最简单的方法可能是Linq
array = array.Distinct().ToArray()
然而,Linq并不总是最快的方法。
如果您不想使用Linq,您可以执行以下操作(未经测试,但关闭)
List<int> compacted = new List<int>();
// If array is not a local variable:
// Assign to a variable to avoid re-evaluating the property every loop iteration
// Otherwise use array.Length as the loop termination condition to enable array
// bounds check elimination. Thanks @Harold for the insight
// http://blogs.msdn.com/b/clrcodegeneration/archive/2009/08/13/array-bounds-check-elimination-in-the-clr.aspx
int max = array.Length;
int last = 0;
for (int i=0; i < max; i++)
{
if (i == 0)
{
compacted.Add(array[i]);
last = array[i];
}
else
{
if (array[i] != last) compacted.Add(array[i]);
last = array[i];
}
}
array = compacted.ToArray();