يمكننا تعريف المجموعة التي تحتوي على عناصر مختلفة فقط بالمصطلح 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);
}
}
}
}عبد العظيم بخاري