כיצד להשתמש ב- HashSet ב- C #

HashSet הוא אוסף ממוטב של אלמנטים ייחודיים ובלתי מסודרים המספק בדיקות מהירות ופעולות סט ביצועיות גבוהות. מחלקת HashSet הוצגה לראשונה ב- .NET 3.5 והיא חלק ממרחב השמות System.Collection.Generic. מאמר זה מדבר כיצד אנו יכולים לעבוד עם HashSets ב- C #.

כדי לעבוד עם דוגמאות הקוד המופיעות במאמר זה, עליך להתקין במערכת Visual Studio 2019 שלך. אם עדיין אין לך עותק, תוכל להוריד את Visual Studio 2019 כאן.

צור פרויקט יישומי קונסולת .NET Core ב- Visual Studio

ראשית, בואו ניצור פרויקט יישום מסוף .NET Core ב- Visual Studio. בהנחה ש- Visual Studio 2019 מותקן במערכת שלך, בצע את השלבים המתוארים להלן כדי ליצור פרויקט יישום .NET Core Console חדש ב- Visual Studio.

  1. הפעל את Visual Studio IDE.
  2. לחץ על "צור פרויקט חדש".
  3. בחלון "צור פרויקט חדש" בחר "יישום קונסולה (.NET Core)" מרשימת התבניות המוצגות.
  4. הקש "הבא.
  5. בחלון "הגדר את הפרויקט החדש שלך" שמוצג הבא, ציין את השם והמיקום של הפרויקט החדש.
  6. לחץ על צור.

פעולה זו תיצור פרויקט יישום קונסולת .NET Core חדש ב- Visual Studio 2019. נשתמש בפרויקט זה כדי לעבוד עם HashSet בחלקים הבאים של מאמר זה.

מה זה HashSet?

HashSet - המיוצג על ידי מחלקת HashSet הנוגעת למערכת System.Collections.Generic namespace - הוא אוסף בעל ביצועים גבוהים ובלתי מסודרים של אלמנטים ייחודיים. לפיכך HashSet אינו ממוין ואינו מכיל אלמנטים כפולים. HashSet גם אינו תומך במדדים - ניתן להשתמש במונה בלבד. HashSet משמש בדרך כלל לפעולות בעלות ביצועים גבוהים הכוללים סט נתונים ייחודי.

מחלקת HashSet מיישמת כמה ממשקים כמוצג להלן:

מחלקה ציבורית HashSet: System.Collections.Generic.ICollection,

System.Collections.Generic.IE מספר,

System.Collections.Generic.IReadOnlyCollection,

System.Collections.Generic.ISet,

System.Runtime.Serialization.IDeserializationCallback,

System.Runtime.Serialization.ISerializable

מכיוון ש- HashSet מכיל רק אלמנטים ייחודיים, המבנה הפנימי שלו מותאם לחיפושים מהירים יותר. שים לב שאתה יכול לאחסן ערך null יחיד ב- HashSet. לכן, HashSet היא בחירה טובה כאשר אתה רוצה אוסף המכיל אלמנטים ייחודיים וניתן לחפש במהירות באלמנטים באוסף.

חפש פריט ב- HashSet ב- C #

כדי לחפש פריט ב- HashSet אתה יכול להשתמש בשיטה מכילה כפי שמוצג בקטע הקוד המופיע להלן:

ריק סטטי ראשי (מחרוזת [] טענות)

        {

            HashSet hashSet = חדש HashSet ();

            hashSet.Add ("A");

            hashSet.Add ("B");

            hashSet.Add ("C");

            hashSet.Add ("D");

            אם (hashSet.Contains ("D"))

                Console.WriteLine ("האלמנט הנדרש זמין.");

            אַחֵר

                Console.WriteLine ("האלמנט הנדרש אינו זמין.");

            Console.ReadKey ();

        }

אלמנטים של HashSet הם תמיד ייחודיים

אם תנסה להוסיף אלמנט כפול ב- HashSet, פשוט יתעלם ממנו, אך שום חריג של זמן ריצה לא ייזרק. קטע הקוד הבא ממחיש זאת.

ריק סטטי ראשי (מחרוזת [] טענות)

{

   HashSet hashSet = חדש HashSet ();

   hashSet.Add ("A");

   hashSet.Add ("B");

   hashSet.Add ("C");

   hashSet.Add ("D");

   hashSet.Add ("D");

   Console.WriteLine ("מספר האלמנטים הוא: {0}", hashSet.Count);

   Console.ReadKey ();

}

כאשר אתה מבצע את התוכנית, הפלט יהיה כפי שמוצג באיור 1.

שקול כעת את קטע הקוד הבא שממחיש כיצד מסלקים אלמנטים כפולים:

מחרוזת [] ערים = מחרוזת חדשה [] {

                "דלהי",

                "קולקטה",

                "ניו יורק",

                "לונדון",

                "טוקיו",

                "וושינגטון",

                "טוקיו"

            };

            HashSet hashSet = HashSet חדש (ערים);

            foreach (var city ב- hashSet)

            {

                Console.WriteLine (עיר);

            }

כאשר אתה מבצע את התוכנית לעיל, שמות העיר הכפולים יוסרו.

הסר אלמנטים מ- HashSet ב- C #

כדי להסיר פריט מ- HashSet עליך להתקשר לשיטת הסר. התחביר של שיטת הסר מופיע להלן.

הסר (פריט T);

אם הפריט נמצא באוסף, שיטת הסר מסירה אלמנט מ- HashSet ומחזירה true לאחר ההצלחה, כוזב אחרת.

קטע הקוד המופיע להלן ממחיש כיצד ניתן להשתמש בשיטת הסר להסרת פריט מ- HashSet.

פריט מחרוזת = "D";

אם (hashSet.Contains (פריט))

{

   hashSet.Remove (פריט);

}

כדי להסיר את כל הפריטים מ- HashSet תוכלו להשתמש בשיטת Clear.

השתמש בשיטות הפעולה של הגדרת HashSet ב- C #

ל- HashSet מספר שיטות חשובות להפעלת קבוצות כגון IntersectWith, UnionWith, IsProperSubsetOf, ExceptWith ו- SymmetricExceptWith.

IsProperSubsetOf

משתמשים בשיטת IsProperSubsetOf כדי לקבוע אם מופע HashSet הוא קבוצת משנה נכונה של אוסף. זה מתואר בקטע הקוד המופיע להלן.

HashSet setA = חדש HashSet () {"A", "B", "C", "D"};

HashSet setB = חדש HashSet () {"A", "B", "C", "X"};

HashSet setC = חדש HashSet () {"A", "B", "C", "D", "E"};

אם (setA.IsProperSubsetOf (setC))

   Console.WriteLine ("setC מכיל את כל האלמנטים של setA.");

אם (! setA.IsProperSubsetOf (setB))

   Console.WriteLine ("setB אינו מכיל את כל האלמנטים של setA.");

כאשר אתה מבצע את התוכנית לעיל, אתה אמור לראות את הפלט הבא בחלון המסוף.

UnionWith

שיטת UnionWith משמשת לתוספת קבוצה כפי שמודגם בקטע הקוד המופיע להלן.

HashSet setA = חדש HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = חדש HashSet () {"A", "B", "C", "X", "Y"};

setA.UnionWith (setB);

foreach (מחרוזת str ב setA)

{

   Console.WriteLine (str);

}

כאשר אתה מבצע את פיסת הקוד הנ"ל, האלמנטים של setB מועתקים ל- setA. אז setA יכלול כעת "A", "B", "C", "D", "E", "X" ו- "Y". 

צומת עם 

שיטת IntersectWith משמשת לייצוג הצומת של שני HashSets. הנה דוגמה להבנת זה.

HashSet setA = חדש HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = חדש HashSet () {"A", "X", "C", "Y"};

setA.IntersectWith (setB);

foreach (מחרוזת str ב setA)

{

    Console.WriteLine (str);

}

כאשר אתה מפעיל את התוכנית לעיל, רק האלמנטים המשותפים לשני HashSets יוצגו בחלון המסוף. הפלט ייראה כך: 

אלא עם

שיטת ExceptWith מייצגת חיסור קבוצות מתמטי והיא פעולה O (n). נניח שיש לך שני HashSets setA ו- setB ואתה מציין את ההצהרה הבאה:

setA.ExceptWith (setB);

זה יחזיר את האלמנטים של setA שאינם קיימים ב- setB. בואו נבין זאת בדוגמה אחרת. שקול את קטע הקוד המופיע להלן.

HashSet setA = חדש HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = חדש HashSet () {"A", "X", "C", "Y"};

setA.ExceptWith (setB);

foreach (מחרוזת str ב setA)

{

   Console.WriteLine (str);

}

בעת ביצוע התוכנית לעיל, האלמנטים "B", "D" ו- ​​"E" יודפסו בחלון המסוף כפי שמוצג באיור 5.

SymmetricExceptWith 

שיטת SymmetricExceptWith משמשת לשינוי HashSet כך שיכיל רק את האלמנטים הייחודיים של שני HashSets, כלומר, האלמנטים שאינם משותפים לשני HashSets. שקול את קטע הקוד הבא שממחיש זאת.

HashSet setA = חדש HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = חדש HashSet () {"A", "X", "C", "Y"};

setA.SymmetricExceptWith (setB);

foreach (מחרוזת str ב setA)

{

  Console.WriteLine (str);

}

כאשר אתה מבצע את הקוד שלעיל, רק האלמנטים הייחודיים של setA ו- setB - כלומר, האלמנטים שנמצאים ב- setA אך לא ב- setB, והאלמנטים שנמצאים ב- setB אך לא ב- setA - יוצגו בחלון המסוף. כפי שמוצג באיור 6.

בעוד שהמורכבות הממוצעת לגישה לאלמנט במערך היא O (n), כאשר n מייצג את מספר האלמנטים במערך, המורכבות היא רק O (1) לגישה לאלמנט מסוים ב- HashSet. זה הופך את HashSet לבחירה טובה לחיפושים מהירים ולביצוע פעולות קבוצות. אתה יכול להשתמש ברשימה אם ברצונך לאחסן אוסף של פריטים בסדר מסוים, ואולי לכלול גם כפילויות. 

כיצד לעשות יותר ב- C #:

  • כיצד להשתמש בפרמטרים בעלי שם ואופציונלי ב- C #
  • כיצד לשווג קוד C # באמצעות BenchmarkDotNet
  • כיצד להשתמש בממשקים שוטפים ושרשור שיטות ב- C #
  • כיצד בודקים יחידות שיטות סטטיות ב- C #
  • כיצד לשחזר את חפצי אלוהים ב- C #
  • כיצד להשתמש ב- ValueTask ב- C #
  • כיצד להשתמש בבלתי משתנה ב- C
  • כיצד להשתמש בקונסט, בקריאה בלבד ובסטטי ב- C #
  • כיצד להשתמש בהערות נתונים ב- C #
  • כיצד לעבוד עם GUIDs ב- C # 8
  • מתי להשתמש בכיתה מופשטת לעומת ממשק ב- C #
  • כיצד לעבוד עם AutoMapper ב- C #
  • כיצד להשתמש בביטויי למבדה ב- C #
  • כיצד לעבוד עם נציגי Action, Func ו- Predicate ב- C #
  • כיצד לעבוד עם נציגים ב- C #
  • כיצד ליישם לוגר פשוט ב- C #
  • כיצד לעבוד עם תכונות ב- C #
  • כיצד לעבוד עם log4net ב- C #
  • כיצד ליישם את דפוס עיצוב המאגר ב- C #
  • כיצד לעבוד עם השתקפות ב- C #
  • כיצד לעבוד עם מערכת קבצים ב- C #
  • כיצד לבצע אתחול עצל ב- C #
  • כיצד לעבוד עם MSMQ ב- C #
  • כיצד לעבוד עם שיטות הרחבה ב- C #
  • איך לנו ביטויים למבדה ב- C #
  • מתי להשתמש במילת המפתח ההפכפכה ב- C #
  • כיצד להשתמש במילת המפתח תשואה ב- C #
  • כיצד ליישם פולימורפיזם ב- C #
  • כיצד לבנות מתזמן משימות משלך ב- C #
  • כיצד לעבוד עם RabbitMQ ב- C #
  • איך לעבוד עם ציצית ב C #
  • חקר שיטות וירטואליות ומופשטות ב- C #
  • כיצד להשתמש ב- Dapper ORM ב- C #
  • כיצד להשתמש בתבנית העיצוב במשקל זבוב ב- C #