الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تعرف على SortedSet و HashSet (جديد دوت نت 4)

بدأه عبد العظيم بخاري في 19 أكتوبر 2010 · 1 رد · 551 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

يمكننا تعريف المجموعة التي تحتوي على عناصر مختلفة فقط بالمصطلح set .

قامت مايكروسوفت باضافة اثنتين من الsets ضمن اطار عمل .NET الجديد وهما :

HashSet<T> و SortedSet<T>

وكلاهما يعملان implement للانترفيس :

ISet<T>

تحتوي HashSet على قائمة عناصر مختلفة وغير مرتبة وتحتوي SortedSet على مثل تلك القائمة لكنها تكون مرتبة .

يحتوي الانترفيس ISet<T> على عدة methods تقدم لنا الكثير من الفوائد .. فيمكننا عمل اتحاد للمجموعات أو عمل تقاطع او فحص اذا ما كانت احدى المجموعات هي مجموعة جزئية من مجموعة اخرى او مجموعة محتوية ومثل هذه الامور ..

لاحظ الكود التالي حيث اننا قمنا بانشاء ثلاثة مجموعات وقمنا بوضع اسماء الفرق الرياضية العالمية والعربية والمصرية .

var globalTeams = new HashSet<string>() { "Real Madrid", "FC Barca", "Milan", "Roma", "Man","Etehad", "Nablus" };
var arabTeams = new HashSet<string>() { "Etehad", "Nablus" };
var eygptTeams = new HashSet<string>() { "Zamlek", "Inbe" };

if (eygptTeams.Add("Ahly"))
   Console.WriteLine("Ahly added");
if (!globalTeams.Add("Real Madrid"))
   Console.WriteLine("Real Madrid was already in this set");

يقوم كلاس HashSet<T> بعمل implement للانترفيس ICollection<T> . لكن لاحظ أن ميثود Add التي قمنا باستخدامها هي خاصة بالكلاس وليس هي التي تعودنا عليها مع انترفيس ICollection<T> حيث انها تختلف في النوع المرجع حيث أن التي لدينا هنا تقوم بارجاع قيمة bool لتعطينا معلومات ما اذا تم اضافة العنصر لتلك المجموعة ام لا لأانه في حال كان ذلك العنصر موجود سابقاً في المجموعة فسوف ترجع لنا فيمة false .

ناتج الكود السابق سيكون كالاتي :

Ahly added
Real Madrid was already in this set

تقوم الميثود IsSubsetOf() و IsSupersetOf() بمقارنة المجموعة مع اي مجموعة اخرى تعمل implement للانترفيس IEnumerable<T> وترجع ناتج bool حيث أن الميثود الأولى تقوم بالتأكد أن كل عنصر من مجموعة arabTeams هو موجود في مجموعة globalTeams . اما الميثود IsSupersetOf() فتقوم بفحص ماذا كانت arabTeams تحتوي على عناصر اضافية عن globalTeams .

if (arabTeams.IsSubsetOf(globalTeams))
  {
    Console.WriteLine("arabTeams is subset of globalTeams");
  }

if (globalTeams.IsSupersetOf(arabTeams))
  {
    Console.WriteLine("globalTeams is a superset of arabTeams");
  }

ناتج هذا المثال :

arabTeams is subset of globalTeams
globalTeams is a superset of arabTeams

نادي الأهلي مثلاً هو نادي عربي مصري ولهذا قمنا باضافته لمجموعة الاندية العربية arabTeams :

arabTeams.Add("Ahly");
if (eygptTeams.Overlaps(arabTeams))
   {
  Console.WriteLine("At least one team is the same with the arabs " +
           "and eygpt teams");

سيظهر عندنا هذا الناتج لأن هناك تداخل بين مجموعة الاندية العربية ومجموعة الاندية المصرية .

At least one team is the same with the arabs and eygpt teams

قمنا بعدها بتعريف متغير allTeams والذي اعطيناه نوع

 SortedSet<string>

حيث قمنا باضافة جميع الفرق السابقة في كل المجموعات العالمية والعربية والمصرية عن طريق استدعاء ميثود UnionWith().

var allTeams = new SortedSet<string>(globalTeams);
allTeams.UnionWith(eygptTeams);
allTeams.UnionWith(arabTeams);

      Console.WriteLine();
      Console.WriteLine("all teams");
      foreach (var team in allTeams)
      {
        Console.WriteLine(team);
      }

عند تنفيذ هذا الكود سوف يتم عرض جميع الفرق لكن لن يتم عرض اسم الفريق اكثر من مرة وذلك لأن الset تحتوي على قيم مختلفة ولا يسمح بقيم متشابهة . ولأن النوع هو SortedSet فسيتم عرض جميع الفرق بشكل مرتب .

Ahly
Etehad
FC Barca
Inbe
Man
Milan
Nablus
Real Madrid
Roma
Zamlek

تعمل ميثود ExceptWith() على ازالة جميع الفرق المصرية من مجموعة allTeams :

allTeams.ExceptWith(eygptTeams);
      Console.WriteLine();
      Console.WriteLine("no eygption team left");
      foreach (var team in allTeams)
      {
        Console.WriteLine(team);
      }

لاحظ انه بعد تنفيذ هذا الكود فلن يتم عرض أي فريق مصري

Etehad
FC Barca
Man
Milan
Nablus
Real Madrid
Roma

السورس كود الكامل للدرس:

using System;
using System.Collections.Generic;

namespace SetSample
{
  class Program
  {
    static void Main()
    {
      var globalTeams = new HashSet<string>() { "Real Madrid", "FC Barca", "Milan", "Roma", "Man","Etehad","Nablus" };
      var arabTeams = new HashSet<string>() { "Etehad", "Nablus" };
      var eygptTeams = new HashSet<string>() { "Zamlek", "Inbe" };

      if (eygptTeams.Add("Ahly"))
        Console.WriteLine("Ahly added");
      if (!globalTeams.Add("Real Madrid"))
        Console.WriteLine("Real Madrid was already in this set");

      if (arabTeams.IsSubsetOf(globalTeams))
      {
        Console.WriteLine("arabTeams is subset of globalTeams");
      }

      if (globalTeams.IsSupersetOf(arabTeams))
      {
        Console.WriteLine("globalTeams is a superset of arabTeams");
      }


      arabTeams.Add("Williams");
      if (eygptTeams.Overlaps(arabTeams))
      {
        Console.WriteLine("At least one team is the same with the arabs " +
           "and eygpt teams");
      }

      var allTeams = new SortedSet<string>(globalTeams); 
      allTeams.UnionWith(eygptTeams);
      allTeams.UnionWith(arabTeams);

      Console.WriteLine();
      Console.WriteLine("all teams");
      foreach (var team in allTeams)
      {
        Console.WriteLine(team);
      }

      allTeams.ExceptWith(eygptTeams);
      Console.WriteLine();
      Console.WriteLine("no eygption team left");
      foreach (var team in allTeams)
      {
        Console.WriteLine(team);
      }




    }
  }
}

عبد العظيم بخاري

الرابط الخاص بي

1
#2

ملاحظة : تم اضافة HashSet في الإصدار السابق لاطار عمل.NET 3.5 اما SortedSet فهي احد اضافات الإصدار الرابع .

مواضيع مشابهة