چگونه مقادیر تکراری را از آرایه در #C حذف کنیم؟

از بین بردن مقادیر تکراری از آرایه در #C اساسا از طریق دریافت مقادیر مجزا است. در #C ما نمی‌توانیم مقادیر را از آرایه حذف کنیم. در عوض ما باید یک آرایه جدید با مقادیری که می‌خواهیم را ایجاد کنیم. بنابراین ما باید مقادیر مجزا را از آرایه مشخص‌شده به دست آوریم و به جای حذف مقادیر تکراری، آرایه جدیدی از مقادیر متمایز ایجاد کنیم.

چگونه مقادیر تکراری را از آرایه در #C حذف کنیم؟

آکادمی برنامه نویسان ، برگزار کننده دوره های آموزش برنامه نویسی با استفاده از اساتید مجرب و حرفه ای در سراسر ایران .

[ جهت مشاهده دوره های درحال ثبت نام کلیک کنید ]

ارائه مدارک معتبر آموزشی و ورود به بازار کار .

مثال زیر مقادیر متمایز را از یک آرایه با استفاده از متد Distinct() دریافت کرده و یک آرایه جدید می‌سازد.

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

امتحان کنید

همین کار را می‌توان برای آرایه رشته‌ای انجام داد.

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

امتحان کنید

برای حذف مقادیر تکراری و به دست آوردن مقادیر مجزا از آرایه آبجکت، باید IEquatable یا IEqualityComparer را پیاده‌سازی کنیم.

مثال زیر به دست آوردن یک آرایه مجزا از آرایه Person است.

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

امتحان کنید

کلاس زیر IEqualityComparer<T> را پیاده‌سازی می‌کند تا با متد Distinct() استفاده شود.

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() بالا، ما FirstName و LastName را با هم مقایسه می‌کنیم. شما همچنین می‌توانید IDها را نیز با هم مقایسه کنید. این بر عهده شماست که چگونه می‌خواهید برابری را در نظر بگیرید.

همچنین می‌توانید IEquatable<T> را در خود کلاس Person پیاده‌سازی کنید تا همان نتیجه را دریافت کنید.

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() ارسال کنیم به دست آوریم، همان‌طور که در کد زیر می‌بینید.

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

امتحان کنید

بنابراین ما می‌توانیم مقادیر متمایز را به دست آوریم و مقادیر تکراری را از آرایه در سی‌شارپ حذف کنیم.