Как работает метод Where? - PullRequest
0 голосов
/ 08 ноября 2018

Мой код :

using System;
using System.Linq;
using System.Collections.Generic;

public class D {
   public string Value { get; set; }
   public D(string v) { this.Value = v; }
}
public class Program
{
   public static void Main()
   {
       List<D> DD = new List<D>();
       DD.Add(new D("2018-11-08"));
       DD.Add(new D("2018-12-01"));
       var dd = DD.Where(d=> { 
          Console.WriteLine($"In predicate: {d.Value}"); 
          return d.Value=="2018-12-01"; 
       });

       var dl = dd.ToList();
       foreach (var d in dl) {
         Console.WriteLine($"Final: {d.Value}");
       }
   }
}

Вывод:

In predicate: 2018-11-08
In predicate: 2018-12-01
Final: 2018-12-01

Если DD содержит 1 миллион элементов, будет ли лямбда в DD.Where выполняться 1 миллион раз?

Что если DD таблица из SQL Server?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

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

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

Where ( d.Value=="2018-12-01")
It will turn into a single method call like this

bool FindValueExample(var d){
  return (d.Value=="2018-12-01");
}

и затем вызывается для каждого элемента.

0 голосов
/ 08 ноября 2018

Если DD содержит 1 миллион элементов, будет ли лямбда в DD. Где выполнить 1 миллион раз?

Ответ зависит от нетерпеливой операции . в этом конкретном случае да , поскольку нетерпеливая операция - ToList, но, скажем, это было First(), Any(), она замкнет, как только найдет элемент, который соответствует критериям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...