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

شنبه 10 اسفند 1398

از بین بردن مقادیر تکراری از آرایه در #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();

امتحان کنید

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

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 4k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید