Вопрос про SortedSet и Comparer

246
22 апреля 2017, 21:36

Есть SortedSet. Для сравнения использую стандартный метод CompareTo().

SortedSet<int> set = new SortedSet<int>(Comparer<int>.Create((a, b) => a.CompareTo(b)));  
set.Add(2);
set.Add(6);
set.Add(6);
set.Add(7);
set.Add(4);
set.Add(11);  

Здесь в set находится 5 значений: 2, 4, 6, 7, 11. Что мне нужно сделать, чтобы в set попадали не только уникальные значения (в моем случае в set должны содержаться 2, 4, 6, 6, 7, 11)?

Answer 1

Никак, коллекции реализующие интерфейс ISet<T> по определению не могут содержать дублированных элементов. Используйте обычный List<T>.

Элегантный способ с LINQ:

List<int> lst = new List<int>(){ 4, 2, 7, 6, 11, 6 };
var sorted = lst.OrderBy(t => t).ToList(); // 2, 4, 6, 6, 7, 11

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

Answer 2

Не знаю, стоит так делать или нет, но в SortedSet<int> можно добавить одинаковые элементы. Метод CompareTo() эквивалентен записи: a > b ? 1 : a < b ? -1 : 0. То есть, если элемент уже содержится в set, то этот элемент не добавляется. Но, если заменить в условии 0 на -1, то компаратор просто поставит одинаковые элементы друг перед другом:

SortedSet<int> set = new SortedSet<int>(Comparer<int>.
   Create((a, b) => a > b ? 1 : a < b ? -1 : -1));         
set.Add(2);
set.Add(6);
set.Add(6);
set.Add(7);
set.Add(4);
set.Add(11);

Здесь set содержит 2, 4, 6, 6, 7, 11.

Answer 3

Используйте другой контейнер, например List<int>, после добавления элементов вызовите метод Sort.

READ ALSO
Binding ConverterParameter={Binding &hellip;}

Binding ConverterParameter={Binding …}

Мне нужно в качестве параметра для конвертера указать Binding, но это невозможно, так как ConverterParameter не является DependencyProperty

210
Как передать переменную через GET запрос

Как передать переменную через GET запрос

Господа, помогите пожалуйста разобратьсяНужно из программы на C# передать переменную в браузерную строку таким образом: http://localhost/Projects/buttons/gett

306
The type initializer for &#39;System.Data.Entity.Migrations.DbMigrationsConfiguration`1&#39; threw an exception

The type initializer for 'System.Data.Entity.Migrations.DbMigrationsConfiguration`1' threw an exception

Доброго времени сутокПытаюсь в проекте MVC включить миграцию базы, в Package Manager Console прописываю: Enable-Migrations -ContextTypeName WebApplication1

367
Передача vector из С++\CLI в C#

Передача vector из С++\CLI в C#

Есть такой метод:

250