在C#中从数组中删除相同的元素

3

如何在C#中从数组中删除相同的元素?

例如:array{0,2,2,8,4,6,1,0,4},输出应为array{0,2,8,4,6,1}

4个回答

6
你可以使用 LINQ 来执行 myArray.Distinct().ToArray()

如果我在Visual Studio 2.0中想要做同样的事情,但是那里没有LINQ这样的概念,我该怎么办? - AB Vyas
你是指 .NET 2.0,对吗?如果没有 LINQ,你将不得不编写自己的方法来筛选数组中的变量,并将它们添加到一个新数组中(如果该数组还没有该变量)。然后该方法将返回新的唯一数组。 - Edgar
请提供任何版本的ASP.NET中常用的解决方案。 - AB Vyas
在.NET 2.0中是可以的,但如何避免呢?我们可以将数组放入for循环中或者使用其他方法吗? - AB Vyas
@amitvyas100688:看看我的答案,我已经更新到.NET 2.0了。 - Episodex

3
using System.Linq;
...
var output = array.Distinct().ToArray();

没有LINQ:

int[] array = new[] { 0, 2, 2, 8, 4, 6, 1, 0, 4 };

List<int> result = new List<int>();
foreach (int element in array)
{
    if (!result.Contains(element))
        result.Add(element);
}
int[] resultArray = result.ToArray();

如果我在Visual Studio 2.0中想要做同样的事情,但是那里没有LINQ这样的概念,我该怎么办? - AB Vyas
ContainsпјҢAddе’ҢToArrayжҳҜLINQжү©еұ•гҖӮ - Edgar
@Edgar:你确定吗?我已经将框架切换到2.0,从使用列表中删除了Linq,现在可以编译和运行。请检查System.Collections.Generic.List<T>。它包含Contains、Add和ToArray方法。 - Episodex
你是正确的。我把它们和“Enumerable”方法混淆了。 - Edgar
请注意,List<T>.Contains 方法的时间复杂度为 O(n),这意味着如果用于较大的数组,则性能将非常差。 (对于相对较小的数组,它应该可以接受。) - LukeH

1
这里有一个在.NET2和C#2中应该能够正确工作的方法。
(由于.NET2中没有可用的HashSet类,它使用Dictionary代替进行高效的O(1)键查找,忽略值。)
int[] input = new int[] { 0, 2, 2, 8, 4, 6, 1, 0, 4 };

int[] output = DistinctItems(input);  // 0, 2, 8, 4, 6, 1

// ...

public static T[] DistinctItems<T>(T[] input)
{
    Dictionary<T, bool> dict = new Dictionary<T, bool>(input.Length);

    return Array.FindAll(input, delegate(T item)
                                    {
                                        if (dict.ContainsKey(item))
                                            return false;

                                        dict.Add(item, true);
                                        return true;
                                    });
}

0
如果您不想允许具有相同值的多个条目,您应该使用一个HashSet<T>。这样,当您添加元素时,您可以直接检测它是否已经存在。但这取决于您的需求...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接