如何在 C# 中删除数组中的重复值?

本文关键字:删除 数组 | 更新日期: 2023-09-18 11:27:32

在 C# 中删除数组中的重复值实质上是获取不同的值。在 C# 中,我们无法删除数组中的值。相反,我们将不得不使用我们想要的值创建一个新数组。因此,我们必须从指定的数组中获取非重复值,并创建一个非重复值的新数组,而不是删除重复值。

下面的示例使用 Distinct() 方法从数组中获取不同的值,并创建一个新数组。

示例: Remove duplicate from integer array

int[] nums = { 1, 2, 3, 4, 3, 55, 23, 2 };
int[] dist = nums.Distinct().ToArray();

字符串数组也可以使用同样的情况。

示例: Remove duplicate from string array

string[] animals = { "Cat", "Alligator", "Fox", "Donkey", "Cat" };
 
string[]  dist = animals.Distinct().ToArray();

要删除重复值并从对象数组中获取不同的值,我们需要实现 IEquatable 或 IEqualityComparer

下面的示例获取 Person 数组的不同数组。

示例: Remove duplicate from object array

Person[] people = {
        new Person(){ FirstName="Steve", LastName="Jobs"},
        new Person(){ FirstName="Bill", LastName="Gates"},
        new Person(){ FirstName="Steve", LastName="Jobs"},
        new Person(){ FirstName="Lary", LastName="Page"}
    };
           
var dist = people.Distinct(new PersonNameComparer()).ToArray();

下面的类实现要与 Distinct() 方法一起使用的IEqualityComparer<T>

示例: IEqualityComparer<T>

class PersonNameComparer : IEqualityComparer<Person>
{
       
    public bool Equals(Person x, Person y)
    {
        return x.FirstName == y.FirstName && x.LastName == y.LastName;
    }
 
    public int GetHashCode(Person obj)
    {
        return obj.Id.GetHashCode() ^ (obj.FirstName == null ? 0 : obj.FirstName.GetHashCode()) ^ (obj.LastName == null ? 0 :obj.LastName.GetHashCode());
    }
}

在上面的Equals()方法中,我们比较了FirstNameLastName。您也可以比较 ID。这取决于您希望如何将其视为平等。

您还可以在 Person 类本身中实现IEquatable<T>以获得相同的结果。

示例: IEquatable<T>

class Person : IEquatable<Person>
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
 
    public bool Equals(Person other)
    {
        return FirstName.Equals(other.FirstName) && LastName.Equals(other.LastName);
    }
 
    public override int GetHashCode()
    {
        return Id.GetHashCode() ^ (FirstName == null ? 0 : FirstName.GetHashCode()) ^ (LastName == null ? 0 : LastName.GetHashCode());
    }
}

现在,我们可以在不传递参数的情况下获得不同的人 Distinct()方法,如下所示。

示例: Get distinct values from object array

Person[] people = {
        new Person(){ FirstName="Steve", LastName="Jobs"},
        new Person(){ FirstName="Bill", LastName="Gates"},
        new Person(){ FirstName="Steve", LastName="Jobs"},
        new Person(){ FirstName="Lary", LastName="Page"}
    };
 
var dist = people.Distinct().ToArray();

因此,我们可以在 C# 中获取不同的值并从数组中删除重复值。