Pull to refresh

Новая коллекция SortedSet<Т> в .NET 4.0

Reading time3 min
Views15K
Original author: Hajan
С новейшим выпуском .NET Framework версии 4.0, в библиотеке классов появилась новая коллекция в System.Collections.Generic — SortedSet<T>.

Две главные особенности SortedSet<T>:

  • Не позволено повторение элементов
  • поддерживается отсортированный порядок, когда элементы вставлены или удалены без воздействия на производительность.


Чтобы было понятнее, давайте пройдём тесты, которые я сделал.



Тест 1: Создание SortedSet и печать всех его элементов (стандартная демонстрация поведения)

var sortedSet1 = new SortedSet<int> { 5, 9, 11, 1, 44, 21, 3, 2, 9};

foreach (int element in sortedSet1)
{
  lbl_Test1.Text += " " + element;
}


* This source code was highlighted with Source Code Highlighter.


Результат: 1 2 3 5 9 11 21 44

Здесь мы можем заметить первую вышеупомянутую особенность. Число 9 дважды появляется в SortedSet, но в результате возвращается только один раз.

Тест 2: Посмотреть числа в диапозоне элементов.

var sortedSet1 = new SortedSet<int> { 5, 9, 11, 1, 44, 21, 3, 2, 9 };

foreach (int element in sortedSet1.GetViewBetween(5, 20))
{
  lbl_Test2.Text += " " + element;
}

* This source code was highlighted with Source Code Highlighter.


Результат: 5 9 11

В тесте 2 можно увидеть, что это довольно полезный метод, который может использоваться, чтобы найти все числа между заданными нижним и верхним значениями. В нашем тесте 5 — нижнее, и 20 — верхнее значение.

Тест 3: Операции разности, объединения и пересечения в SortedSet
var sortedSet1 = new SortedSet<int> { 5, 9, 11, 1, 44, 21, 3, 2, 9 };
var sortedSet2 = new SortedSet<int> { 11, 7, 22, 21, 25, 30};

lbl_Test3.Text += "Разность:";

foreach (int element in sortedSet1.Except(sortedSet2))
{
  lbl_Test3.Text += " " + element;
}

lbl_Test3.Text += "; Объединение:";

foreach (int element in sortedSet1.Union(sortedSet2))
{
  lbl_Test3.Text += " " + element;
}

lbl_Test3.Text += "; Пересечение:";

foreach (int element in sortedSet1.Intersect(sortedSet2))
{
  lbl_Test3.Text += " " + element;
}

* This source code was highlighted with Source Code Highlighter.


Результат: Разность: 1 2 3 5 9 44; Объединение: 1 2 3 5 9 11 21 44 7 22 25 30; Пересечение: 11 21;

В тесте 3 у нас есть два SortedSet. Используя вышеуказанные методы, мы выполняем различные операции.

Есть некоторые более полезные методы, такие как

sortedSet1.UnionWith(sortedSet2);

который навсегда сольёт два SortedSet, исключая повторяющиеся элементы.

Test 4: Удаление элементов используя Remove(int) и RemoveWhere(Predicate)

var sortedSet1 = new SortedSet<int> { 5, 9, 11, 1, 44, 21, 3, 2, 9 };

sortedSet1.Remove(5);

lbl_Test4.Text = "Без элемента номер 5:";

foreach (int element in sortedSet1)
{
  lbl_Test4.Text += " " + element;
}

sortedSet1.RemoveWhere(X => X % 2 == 0);

lbl_Test4.Text += "; Только нечетные элементы:";

foreach (int element in sortedSet1)
{
  lbl_Test4.Text += " " + element;
}


* This source code was highlighted with Source Code Highlighter.


Результат: Без элемента номер 5: 1 2 3 9 11 21 44; Только нечетные элементы: 1 3 9 11 21.

Внимание: все результаты показаны в элементе управления <asp:Label /> у которых следующие ID: lbl_Test1, lbl_Test2, lbl_Test3, lbl_Test4 – созданные только в целях тестирования, не привязанные ко всему предмету сообщения в блоге.

Вы можете скачать рабочий исходник: СКАЧАТЬ.

Надеюсь, что этот пост был полезным и информативным.
Tags:
Hubs:
Total votes 64: ↑45 and ↓19+26
Comments17

Articles