#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) .