Как работает метод Where?

Мой код :

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 ответа


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

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


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

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

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");
}

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


Есть идеи?

10000