В чем разница между запрашиваемым.Содержит метод и метод List.Contains в C #?

#c#

#c#

Вопрос:

 List<A> list=new List<A>();
var a=new A();
list.Add(a);
list.Contains(a);
list.Contains<A>(a);
  

В чем разница между этими двумя случаями?
Почему существует два метода?

Ответ №1:

В этом случае нет разницы между List .Содержит (который является реализацией ICollection .Содержит) и перечислимый.Содержит — в случае, когда перечисляемый является коллекцией, IEnumerable .Contains просто вызывает ICollection .Содержит.

Причина в том, что некоторые коллекции, такие как SortedSet, могут реализовать метод Contains, который работает быстрее, чем O (n) раз. Для не-коллекционных типов Enumerable, IEnumerable .Contains будет выполнять линейный поиск по перечислению.

Существует также Queryable .Содержит, но это другое — список не является запрашиваемым. Запрашивается.Contains может встроить это в выражение запроса, которое можно преобразовать (например, в SQL). Запрашиваемые и перечислимые методы расширения сильно отличаются друг от друга.

Комментарии:

1. Запрашивается. Contains реализуется с помощью HashSet ?

2. Запрашивается. Contains реализуется поставщиками запросов, которые обычно представляют собой классы, которые строят деревья запросов для преобразования запросов C # в другие типы запросов, такие как SQL. Одним из примеров могут быть классы DbSet или ObjectSet из Entity Framework. Традиционные коллекции, такие как HashSet и List, можно перечислить, но не запрашивать; Запрашиваемые коллекции действительно используются для внешних источников данных, таких как базы данных, в то время как коллекции объектов C # в памяти, как правило, просто перечислимы.

Ответ №2:

Если вы спросите о различиях в его функциональности, то на самом деле их нет.

List.Contains() является частью ICollection интерфейса и существует с .NET Framework 2.0. Разработчики всегда использовали этот метод перед LINQ, чтобы проверить, содержит ли List тот или иной ICollection элемент.

.Contains<T> является частью LINQ . Это язык запросов, который позволяет использовать этот метод со всеми IEnumerable коллекциями, даже с массивами или пользовательскими; источники данных любят базы данных; форматы данных, такие как JSON или XML и т.д.

На самом деле, когда вы вызываете LINQ .Contains<T> для IEnumerable коллекции, которая ICollection (например, List<T> ), она вызывает свой собственный ICollection.Contains метод.

 public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value)
{
  ICollection<TSource> collection = source as ICollection<TSource>;
  if (collection != null)
    return collection.Contains(value);
  return Enumerable.Contains<TSource>(source, value, (IEqualityComparer<TSource>) null);
}
  

Ответ №3:

Алгоритмическая сложность «LIST.contains» всегда равна O (n) .

Где сложность «Queryable.contains» зависит от реализованной коллекции. Например, если базовой коллекцией является «Hashset», то алгоритмическая сложность равна O(1) .