2016-01-21 2 views
4

Я могу быть глупым, но в чем разница между contains и contains<> в VS whisper help? Иногда я получаю оба, иногда только один с <>.Разница между содержит и содержит <> в C#

Это то, что я пытаюсь использовать, содержит, где, как и в некоторых решениях, найденных здесь в SO, но это вызывает ошибку, которая имеет лучший метод перегрузки, имеет некоторые недопустимые аргументы (их метод равен System.Linq.ParallelEnumerable.Contains<TSource>(...)).

Мой код выглядит так:

defaultDL = db.SomeEntity 
        .Where(dl => dl.Something == this.Something 
         && (dl.AllLocation == true || this.SomeOtherEntity.Select(loc => loc.Location).Contains(dl.Location))) 
        .ToList(); 
+0

'Содержит <>' не существует. Может быть, вы имели в виду «Содержит '? –

+1

Да, это то, что я имел в виду, но в VS-шепот написано 'code' (Contains <>), поэтому я копирую его вот так. –

ответ

4

Если перейти к определению System.Linq.Enumerable.Contains метода, вы увидите, что он объявлен как общий метод расширения.

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value); 

Причина, почему иногда вызывается с <type> аргументами, а иногда нет - потому что большую часть времени компилятор будет анализируем свои аргументы и определить тип автоматически. Поэтому под капотом он будет переписан на явный общий вызов.

Как

someCollection.Contains(someValue); 

фактически компилируется в

Enumerable.Contains<CollectionInnerType>(someCollection, someValue); 
+0

Большое спасибо, я понял, когда я понял связь с Enumerable. –

1

Linq имеет метод расширения Contains<>. Когда вы его используете, вы можете ввести параметры типа или нет. Если вы не входите - компилятор C# попытается указать аргументы неявно.

Некоторые другие перечислимые классы (например, List<>) реализуют собственный метод Contain.

Итак, когда IntelliSense предлагает метод Contains<> - это реализация от Linq; когда Contains - это собственная реализация конкретного класса.

О различии в реализации. Собственная реализация класса кажется более быстрой, чем реализация Linq, поскольку реализация Linq более абстрактна из класса конечных точек.

+0

'Содержит <>' не существует. Может быть, вы имели в виду «Содержит '? –

+0

, конечно, я имею в виду 'Содержит '. Но в авторской терминологии это выглядит так: 'Содержит <>' –

+0

на самом деле, я думаю, что нет никакой разницы. 'method_name <>' - это метод под названием 'method_name' с одним общим параметром' method_name <,> '- с двумя и т. д. –

0

Существует много возможностей. Но здесь самые распространенные.

Я предполагаю, что SomeOtherEntity является ссылкой на ICollection<T>. Это стандартный метод на ICollection, который сканирует в памяти для ссылочного равенства (в зависимости от реализации). You can read about that here.

Также есть Contains<T>, который исходит от LINQ. Это метод расширения. Он работает на IEnumerable<T>, из которого ICollection<T> происходит. You can read about this one here.

0

У этого есть следующее основное отличие.

  1. Содержит метод расширения, а Contains - нет.
  2. Содержит запрос IEnumerable<T>, в то время как Contais возвращает значение bool и определяет, присутствует ли ваш товар или нет. В Contain вы можете передать deligates, что на основании условия вернет IEnumerable<T>.
+0

'Содержит <>' не существует. Может быть, вы имели в виду «Содержит '? –

+0

Да, я имею в виду Содержит , Обновление моего ответа. –

Смежные вопросы