Приклад 1. Без використання класу HashSet
Створити 2 лінійні списки цілих чисел (класу List<T>), у яких є однакові елементи. Створити список unionList, який містить елементи обох списків без повторень (об’єднання). Створити список intersectList, який містить елементи, які є в обох списках (перетин).
class Program
{
static void PrintList(List<int> list)
{
Console.Write("{ ");
foreach (var item in list)
{
Console.Write(item);
Console.Write(" ");
} Console.WriteLine("}");
}
static void Main(string[] args)
{
List<int> firstList = new List<int>();
firstList.Add(1);
firstList.Add(2);
firstList.Add(3);
firstList.Add(4);
firstList.Add(5);
Console.Write("firstList = ");
PrintList(firstList);
List<int> secondList = new List<int>();
secondList.Add(2);
secondList.Add(4);
secondList.Add(6);
Console.Write("secondList = ");
PrintList(secondList);
List<int> unionList = new List<int>();
unionList.AddRange(firstList);
for (int i = unionList.Count - 1; i >= 0; i--)
{
if (secondList.Contains(unionList[i]))
{
unionList.RemoveAt(i);
}
}
unionList.AddRange(secondList);
Console.Write("union = ");
PrintList(unionList);
List<int> intersectList = new List<int>();
intersectList.AddRange(firstList);
for (int i = intersectList.Count - 1; i >= 0; i--)
{
if (!secondList.Contains(intersectList[i]))
{
intersectList.RemoveAt(i);
}
}
Console.Write("intersect = ");
PrintList(intersectList);
Console.ReadKey();
}
}
Реалізуємо той самий приклад з використанням класу HashSet.
class Program
{
static void PrintList(HashSet<int> list)
{
Console.Write("{ ");
foreach (var item in list)
{
Console.Write(item);
Console.Write(" ");
}
Console.WriteLine("}");
}
static void Main(string[] args)
{
HashSet<int> firstList = new HashSet<int>(); //перша множина
firstList.Add(1);
firstList.Add(2);
firstList.Add(3);
firstList.Add(4);
firstList.Add(5);
Console.Write("firstList = ");
PrintList(firstList);
HashSet<int> secondList = new HashSet<int>(); //друга множина
secondList.Add(2);
secondList.Add(4);
secondList.Add(6);
Console.Write("secondList = ");
PrintList(secondList);
//Об'єднання множин
HashSet<int> unionList = new HashSet<int>(firstList);
unionList.UnionWith(secondList); //Об'єднання множин
Console.Write("union = ");
PrintList(unionList);
//перетин множин
HashSet <int> intersectList = new HashSet<int>(firstList);
intersectList.IntersectWith(secondList);
Console.Write("intersect = ");
PrintList(intersectList);
Console.ReadKey();
}
}
Важливо
При роботі з множинами в .NET Framework необхідно враховувати наступну особливість.
Результат виконання операції з множинами зберігається в тій змінній, для якої був викликаний відповідним методом, переписуючи початкову колекцію. Тобто, перша колекція буде змінена.
Приклад 2
class Program
{
static void Main()
{
HashSet<int> evenNumbers = new HashSet<int>();
HashSet<int> oddNumbers = new HashSet<int>();
for (int i = 0; i < 5; i++)
{
// Заповнення першої колекції evenNumbers парними числами
evenNumbers.Add(i * 2);
// Заповнення другої колекції oddNumbers непарними числами
oddNumbers.Add((i * 2) + 1);
}
Console.Write("evenNumbers contains {0} elements: ", evenNumbers.Count);
DisplaySet(evenNumbers);
Console.Write("oddNumbers contains {0} elements: ", oddNumbers.Count);
DisplaySet(oddNumbers);
// Створення нової колекції numbers з чисел evenNumbers.
HashSet<int> numbers = new HashSet<int>(evenNumbers);
Console.WriteLine("numbers UnionWith oddNumbers...");
//Об’єднання множин
numbers.UnionWith(oddNumbers);
Console.Write("numbers contains {0} elements: ", numbers.Count);
DisplaySet(numbers);
Console.ReadKey();
}
static void DisplaySet(HashSet<int> set)
{
Console.Write("{");
foreach (int i in set)
{
Console.Write(" {0}", i);
}
Console.WriteLine(" }");
}
}
Елементами множини можуть бути рядки чи об’єкти класів.