Створимо клас 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.
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");
}
}
Різницю множин можна використати, наприклад, для визначення відсутнього товару в магазині.
Для цього потрібно створити клас 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);
}
}
}
Результат
Роботу з множинами можна реалізувати за допомогою методів розширення 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
Приклад 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
Apple
IBM
Samsung