Если вы посмотрите исходный код для IEnumerable.Count , вы увидите, что за кулисами он делает именно это:
- Запускает
foreach
l oop в коллекции; - Проверяет ваш лямбда-код для каждого члена коллекции;
- Если лямбда приводит к
true
, то переменная счетчика увеличивается; - In в конце он возвращает значение счетчика.
В этом конкретном контексте ваша лямбда по существу рассматривается как указатель на функцию, только на этот раз со строго определенным интерфейсом: он принимает один параметр любого типа у вас есть в вашей коллекции, и возвращает bool
.
Что касается того, откуда берется ссылка System.Linq
и как она разрешается без явного @using
, кажется, что компоненты Razor на самом деле являются частичными классами с другие их части «скрыты» (то есть автоматически сгенерированы компилятором). В вашем конкретном примере, если вы go перейдете в папку \obj\Debug\netcoreapp3.1\Razor\Pages
в своем проекте, вы найдете там файл с именем «Todo.razor.g.cs», который содержит следующее:
namespace BlazorApp1.Pages
{
#line hidden
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
...
[Microsoft.AspNetCore.Components.RouteAttribute("/todo")]
public partial class Todo : Microsoft.AspNetCore.Components.ComponentBase
{
...
}
}
Это означает, что эти 5 пространств имен всегда доступны во всех компонентах, независимо от содержимого _Imports.razor
. Не уверен, почему были выбраны именно эти, вероятно, вопрос к Microsoft.