Материал: Лекція 11. Множини

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Приклад 3.

Створимо клас Person для з властивостями Name, Rating.

class Person

{

public string Name { get; set; }

public int Rating { get; set; }

}

Створимо 2 множини для студентів двох груп, потім об’єднаємо ці множини.

static void Main(string[] args)

{

//створити 2 множини об'єктів

//

HashSet<Person> pi_71 = new HashSet<Person>();

pi_71.Add(new Person { Name = "Іванов", Rating = 60 });

pi_71.Add(new Person { Name = "Лазаренко", Rating = 65 });

pi_71.Add(new Person { Name = "Правдивий", Rating = 95 });

//

HashSet<Person> k_71 = new HashSet<Person>();

k_71.Add(new Person { Name = "Іванов", Rating = 60 });

k_71.Add(new Person { Name = "Митюк", Rating = 65 });

k_71.Add(new Person { Name = "Юшков", Rating = 10 });

//

HashSet<Person> union_group = new HashSet<Person>(pi_71);

union_group.UnionWith(k_71);

DisplaySet("Група ПІ-71", pi_71);

DisplaySet("Група K-71", k_71);

DisplaySet("Групи К,ПІ-71", union_group);

Console.ReadKey();

}

static void DisplaySet(string Message,HashSet<Person> set)

{

Console.WriteLine(Message);

foreach (Person pers in set)

{

Console.WriteLine(" {0}, {1}", pers.Name,pers.Rating);

}

}

}

Результат:

2.2. Клас SortedSet<T>

Клас SortedSet<T> представляє множину відсортованих елементів. Цей клас зручно застосовувати, якщо потрібно швидко відсортувати елементи, а також отримати відсортований результат операцій з множинами. Властивості і методи цього класу практично співпадають з властивостями і методами класу HashSet.

Приклад 4. Демонструє операції з відсортованими множинами

static void Main()

{

// Створення двох множин

SortedSet<char> ss = new SortedSet<char>();

SortedSet<char> ss1 = new SortedSet<char>();

ss.Add('A');

ss.Add('B');

ss.Add('C');

ss.Add('Z');

ShowColl(ss, "Перша колекція: ");

ss1.Add('X');

ss1.Add('Y');

ss1.Add('Z');

ShowColl(ss1, "Друга колекція");

ss.SymmetricExceptWith(ss1);

ShowColl(ss, "Виключення однакових елементів двох множин (симетрична різниця): ");

ss.UnionWith(ss1);

ShowColl(ss, "Об'єднання множин: ");

ss.ExceptWith(ss1);

ShowColl(ss, "Віднімання множин");

Console.ReadLine();

}

static void ShowColl(SortedSet<char> ss, string s)

{

Console.WriteLine(s);

foreach (char ch in ss)

Console.Write(ch + " ");

Console.WriteLine("\n");

}

}

Приклад 5.

Різницю множин можна використати, наприклад, для визначення відсутнього товару в магазині.

Для цього потрібно створити клас Tovar. Для того щоб можна було порівнювати об’єкти колекції, потрібно зробити клас нащадком інтерфейсу IComparable<Tovar> і реалізувати метод порівняння.

class Tovar: IComparable<Tovar>

{

public int Kod {get;set;}

public string Name { get; set; }

public int CompareTo(Tovar t)

{

//Порівняння об'єктів за віком

Tovar tovar = t as Tovar;

if (tovar != null)

return Kod.CompareTo(t.Kod);

else

throw new ArgumentException("об'єкт не належить до типу Tovar");

}

}

Основна програма

class Program

{//різниця множин

static void Main(string[] args)

{

//Товари на складі

SortedSet<Tovar> tovar = new SortedSet<Tovar>();

tovar.Add(new Tovar { Kod = 4, Name = "Tovar4" });

tovar.Add(new Tovar { Kod = 2, Name = "Tovar2" });

tovar.Add(new Tovar { Kod = 3, Name = "Tovar3" });

tovar.Add(new Tovar { Kod = 1, Name = "Tovar1" });

DisplaySet("Товари на складі ", tovar);

//Товари в магазині

SortedSet<Tovar>tovar1 = new SortedSet<Tovar>();

tovar1.Add(new Tovar { Kod = 2, Name = "Tovar2" });

tovar1.Add(new Tovar { Kod = 1, Name = "Tovar1" });

DisplaySet("Товари в магазині", tovar1);

//Товари, які потрібно замовити

tovar.ExceptWith(tovar1);

DisplaySet("Потрібно замовити", tovar);

Console.ReadKey();

}

static void DisplaySet(string Message, SortedSet<Tovar> set)

{

Console.WriteLine(Message);

foreach (Tovar t in set)

{

Console.WriteLine(" {0}, {1}",t.Kod, t.Name);

}

}

}

Результат

3. Використання Linq для роботи з множинами

Роботу з множинами можна реалізувати за допомогою методів розширення Linq. Ці методи знаходяться в просторі імен Linq.

Це такі методи:

Except: повертає різницю двох колекцій, тобто ті елементи, які є тільки в одній колекції;

Union: об'єднує дві однорідні колекції;

Intersect: повертає перетин двох колекцій, тобто ті елементи, які зустрічаються в обох колекціях;

Крім цього в Linq є багато інших методів для роботи з колекціями [https://metanit.com/sharp/tutorial/15.1.php]

Приклад 6. Різниця множин

За допомогою методу Except можна отримати різницю двох множин:

string[] soft = { "Microsoft", "Google", "Apple"};

string[] hard = { "Apple", "IBM", "Samsung"};

 

// різниця множин

var result = soft.Except(hard);

foreach (string s in result)

    Console.WriteLine(s);

В даному випадку з масиву soft видаляються всі елементи, які є в масиві hard. Результатом операції будуть два елементи:

Microsoft

Google

Приклад 7. Перетин множин

Для отримання перетину множин, тобто спільних для обох наборів елементів, застосовується метод Intersect:

string[] soft = { "Microsoft", "Google", "Apple"};

string[] hard = { "Apple", "IBM", "Samsung"};

// перетин множин

var result = soft.Intersect(hard);

foreach (string s in result)

    Console.WriteLine(s);

Так як обидва набори мають тільки один спільний елемент, то відповідно тільки він і потрапить в результуючу вибірку:

Apple

Приклад 8. Об'єднання множин

Для об'єднання двох множин використовується метод Union. Його результатом є новий набір, в якому присутні елементи, як з однієї, так і з другої множини. Елементи, які повторюються, додаються в результат тільки один раз:

string[] soft = { "Microsoft", "Google", "Apple"};

string[] hard = { "Apple", "IBM", "Samsung"};

 

// Об'єднання множин

var result = soft.Union(hard);

 

foreach (string s in result)

    Console.WriteLine(s);

Результатом операції буде наступний набір:

Microsoft

Google

Apple

IBM

Samsung

Источник: https://studfile.net/preview/16420686/