преобразовать общий список в ISet

#c#

#c#

Вопрос:

Кому-нибудь приходилось назначать список ISet ? Как мне это сделать?

Допустим, у меня есть класс

 class Foo
{
  ISet<Item> Items { get; set; }
}
  

Теперь я хочу сделать следующее:

 var foo = new Foo() { Items = new List<Item>() { new Item() } }
  

Ответ №1:

 List<Item> myList = ...
foo.Items = new HashSet<Item>( myList );
  

Имейте в виду, что a Set , в отличие от a List , должен содержать каждый элемент ровно один раз. Следовательно, если myList содержит несколько копий некоторых элементов, все эти копии, кроме одной, не попадут в набор.

Равенство элементов (для обнаружения нескольких копий) определяется методами Equals и GetHashCode . Если вы хотите использовать другое определение равенства, вы можете использовать перегрузку HashSet конструктора, которая принимает IEqualityComparer<Item> .

Ответ №2:

List<T> не реализует ISet<T> интерфейс… Итак, это невозможно.

Единственными классами, которые реализуют, ISet<T> являются HashSet<T> и SortedSet<T> .

Самым близким, что вы могли бы получить, было бы (если вы удалите ненужный List объект между ними):

 var foo = new Foo { Items = new HashSet<Item> { new Item() } };