1

如何使用函数来压缩具有重复条目的数组?

例如!

一个函数,它将接受一个排序的整数数组并返回压缩后的数组。即给定一个数组包含:1,2,6,8,8,8,9,10,10,当函数返回时,数组的内容应该是:1,2,6,8,9,10 .

这不是硬件。我正在尝试制作一个可以做到这一点的功能。

4

3 回答 3

7

怎么样:

array = array.Distinct().ToArray();

或者,作为一个函数:

private int[] RemoveDuplicates(int[] array)
{
    return array.Distinct().ToArray();
}

然后调用它:

array = RemoveDuplicates(array);
于 2012-07-02T17:22:37.793 回答
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();
于 2012-07-02T18:36:22.940 回答
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();
于 2012-07-02T17:23:29.010 回答