2016-06-25 4 views
0

Ниже приведены два метода расширения.
ContainsAny() проверяет, содержит ли какой-либо из строковых элементов в IEnumerable строку, в которую вызывается метод. OK, No problemЛюбое() в выражении цепочки Linq

_ContainsAny() использует закодированное выражение Linq, чтобы проверить, содержится ли какой-либо из строковых элементов в IEnumerable в строке.

1) Первый вопрос: есть ли вообще отличие в результате того, что он может производить следующие два разных типа логики. Я получаю те же результаты.

2) Второй вопрос: как работает выражение Chain Linq? return stringsToMatch.Any(item => source.Contains(item)); Содержит() возвращает логическое значение для метода Any()? Как именно методы Any() и Contains() работают вместе в этом цепном выражении?

public static class ContainsAnyExtension 
    { 



     public static bool ContainsAny(this string source, IEnumerable<string> stringsToMatch) 
     { 
      return stringsToMatch.Contains(source); 

     } 



     public static bool _ContainsAny(this string source, IEnumerable<string> stringsToMatch) 
     { 
      return stringsToMatch.Any(item => source.Contains(item)); 

     } 



    } 

ответ

1

Ответ на ваши вопросы:

Во-первых, они не то же самое на всех, первый один проверяет, если список имеет строку в качестве ее как элемент, в то время как второй один проверяет каждый элементов если в нем есть строка.

1) Первый вопрос, существует ли вообще differnce в результате чего он может произвести следующие эти два типа diffent логики. Я получаю те же результаты.

Да, первая будет возвращать только если список содержит элемент (истина/ложь) Второй вернется, если какой-либо из элементов имеет строку cotnained В НЕМ.

2) Второй вопрос: как работает функция Chain Linq ? return stringsToMatch.Any (item => source.Contains (item)); Содержит() возвращает логическое значение для метода Any()? Как именно методы Any() и Contains() работают вместе в этой цепочке? выражение?

Это не цепное выражение, его просто булева функция добавлена ​​как расширение.

+0

Да, я получаю его вместе с логической разницей между двумя, – Aarondv1

+0

Да, я получаю его с логической разницей между ними, но в выражении Linq Any() возвращает логическое, совершенное. Но в выражении Any присутствует source.Contains (item), который, как я понимаю, просматривает каждый из элементов в последовательности и проверяет его на строку «source». Если Any() из этих вычислений source.Contains (item) возвращает true, то метод Any вернет true для функции. Это верно? – Aarondv1

0

Это две различные функции:

 public static bool ContainsAny(this string source, IEnumerable<string> stringsToMatch) 
     { 
      return stringsToMatch.Contains(source); 
     } 

Первый из них является метод расширения определяется в LINQ. Он проверяет список stringsToMatch, чтобы узнать, равна ли одна из этих строк вашему source. Как и в, он сравнивает строки со строками один к одному.

 public static bool _ContainsAny(this string source, IEnumerable<string> stringsToMatch) 
     { 
      return stringsToMatch.Any(item => source.Contains(item)); 
     } 

Второй вариант - это метод экземпляра string. То, что делает source.Contains(item), заключается в том, что, ссылаясь на документацию, «Возвращает значение, указывающее, имеет ли указанная подстрока в этой строке». В этом случае он проверяет, содержит ли source подстроку item.

Что Any() делает то, что он возвращает true или false ли какая-либо деталь в перечислимых возвращает true для лямбда-функции. Вместо того, чтобы функции лямбда можно определить анонимный метод, и он будет просто работать так же:

 return stringsToMatch.Any(delegate (string item) { return source.Contains(item); }); 

Вы можете, вероятно, понять, почему лямбда-функция используется. Он выглядит просто красивее.

Редактировать: Я играл с ним в Visual Studio и, видимо, это тоже допустимый код. Привет! Я понятия не имею, будет ли это работать или нет.

 return stringsToMatch.Any(source.Contains); 

Чтобы увидеть определение обоих методов, щелкните правой кнопкой мыши их в Visual Studio и выберите «Перейти к определению» или «Peek определение». Это приведет вас к определению и комментариям для них обоих.

Чтобы увидеть разницу себе, попробуйте с набором данных, где source не в stringstoMatch, но некоторые из строк в stringsToMatch являются подстроки source. Вы сразу увидите это расхождение. Например: "abc" - подстрока "xyzabcdef".

Edit: Здесь я попробовал его в C# интерактивному:

> var list = new List<string> { "abc", "def", "xyz" }; 
> var x = "abcd"; 
> x.ContainsAny(list) 
false 
> x._ContainsAny(list) 
true 

Вы можете увидеть разницу между этими двумя методами в настоящее время.

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