压缩C#中的数组函数

时间:2012-07-02 17:20:43

标签: c#

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

例如!

一个函数,它将获取一个排序的整数数组并返回压缩的数组。也就是说,给定一个包含:1,2,6,8,8,8,9,10,10的数组,当函数返回时,数组的内容应为:1,2,6,8,9,10

这不是新闻。我正在尝试制作一个能够做到这一点的功能。

3 个答案:

答案 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();