如何使用函数来压缩具有重复条目的数组?
例如!
一个函数,它将接受一个排序的整数数组并返回压缩后的数组。即给定一个数组包含:1,2,6,8,8,8,9,10,10,当函数返回时,数组的内容应该是:1,2,6,8,9,10 .
这不是硬件。我正在尝试制作一个可以做到这一点的功能。
如何使用函数来压缩具有重复条目的数组?
例如!
一个函数,它将接受一个排序的整数数组并返回压缩后的数组。即给定一个数组包含:1,2,6,8,8,8,9,10,10,当函数返回时,数组的内容应该是:1,2,6,8,9,10 .
这不是硬件。我正在尝试制作一个可以做到这一点的功能。
怎么样:
array = array.Distinct().ToArray();
或者,作为一个函数:
private int[] RemoveDuplicates(int[] array)
{
return array.Distinct().ToArray();
}
然后调用它:
array = RemoveDuplicates(array);
扩展方法:
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();
最直接的方法可能是使用 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();