چگونه مقادیر تکراری را از آرایه در #C حذف کنیم؟
شنبه 10 اسفند 1398از بین بردن مقادیر تکراری از آرایه در #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();
بنابراین ما میتوانیم مقادیر متمایز را به دست آوریم و مقادیر تکراری را از آرایه در سیشارپ حذف کنیم.
- C#.net
- 4k بازدید
- 3 تشکر