2016-10-04 15 views
2

, мне было интересно, если кто-то сделает очень подробное объяснение того, что именно я сделал здесь, я знаю, с чем я работаю, и что смысл кода, однако, если Я должен был объяснить это, я был бы невежественным.Создавая собственные методы расширения LINQ

public static IEnumerable<TSource> VisitorWhere<TSource>(this IEnumerable<TSource> enumerable, Predicate<TSource> CompareMethod) 
{ 
    ICollection<TSource> temp = new List<TSource>(); 

    foreach (TSource item in enumerable) 
    { 
     if(CompareMethod(item)) 
     { 
      temp.Add(item); 
     } 
    } 
    return temp; 
} 
+0

Здесь: https://msdn.microsoft.com/en-us//library/bb383977.aspx –

+0

Я знаю, Ive смотрел это уже, но это действительно не помогает мне это понять. –

+4

Это просто интересная версия 'Enumerable.Where'. – Lee

ответ

9

Ваш код выше просто extension method, что перебирает коллекцию и возвращает только те элементы, которые соответствуют предикату:

Методы расширения позволит вам «добавить» методы к существующим типам без создания нового производный тип, перекомпиляция или иное изменение исходного типа.

Я бы не назвал это методом LINQ. Большинство методов LINQ свободно (вы можете их связать), как и с вашим методом расширения, но то, что вам не хватает в вашем случае, заключается в том, что выполнение аналогичных методов, таких как Where, равно deferred (т.е. предметы потребляются один за другим и только когда они запрашиваются). С другой стороны, вы выполняете немедленно и каждый раз вводите всю входную последовательность.

Посмотрите в yield return:

public static IEnumerable<TSource> VisitorWhere<TSource>(this IEnumerable<TSource> enumerable, Predicate<TSource> compareMethod) 
{ 
    foreach (TSource item in enumerable) 
    { 
     if (compareMethod(item)) 
     { 
     yield return item; 
     } 
    } 
} 
+1

Добро пожаловать. Примечание: Это написано «отложено» (не «разное») ;-) Еще одно замечание (хотя я не редактировал это): вы в основном заявляете, что отложенное выполнение является обязательным признаком для методов LINQ. Это не совсем так. Существует несколько операторов LINQ, которые оценивают последовательность с нетерпением; например 'Count',' OrderBy' и т. Д. Они должны, чтобы делать то, что они должны делать. С другой стороны, 'Where' все еще может делать то, что, как предполагается, будет лениво/выполняться в отложенной манере, поэтому я согласен с вами в том, что так оно и должно быть реализовано. – stakx

+0

@stakx - Я, что я имел в виду, что большинство из них свободно и отсрочено. В основном для того, чтобы это был метод LINQ, он должен находиться под этим пространством имен :), но для его потребности это отложенная часть. –

1

Это способ, например, отфильтруйте список посетителей, используя условие, которое вы предоставляете в предикате. Если у вас есть список:

List<string> visitorList = new List<string>(){"dave", "clare", "steve"}; 

С следующего предиката:

Predicate<string> daveFinder = (string s) => {return s=="dave";}; 

Использование метода расширения будет возвращать IEnumerable с одним элементом - "Дэйвом":

List<string> daveVisitors = visitorList.VisitorWhere(daveFinder).ToList(); 

радость общих типов означает, что вы можете предоставить IEnumerable, содержащий любой вкус объектов и соответствующий Predicate, и ваш метод расширения все равно будет работать.

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

  • Нет связанных вопросов^_^