Понимание лямбда в razor / blazor - PullRequest
0 голосов
/ 25 мая 2020

Я очень новичок в синтаксисе бритвы и C# в целом, и я просто проработал несколько курсов по блейзеру и застрял, пытаясь понять использование лямбды в одном из примеров (здесь для ссылки https://docs.microsoft.com/en-us/aspnet/core/tutorials/build-your-first-blazor-app?view=aspnetcore-3.1#build -a-todo-list

этот бит:

<h3>Todo (@todos.Count(todo => !todo.IsDone))</h3>

Весь код ниже ... моя проблема в том, что я понимаю, что он оценивает, являются ли члены из списка todos истинны / ложны, а затем помещается count из них на страницу, а также что todo является локальной переменной в Lambda ( потому что если я изменю его на todoxxx =>! todoxxx.IsDone , он все равно будет работать).

Я не понимаю, как он проверяет каждую запись в todos список для его оценки?

Я заранее прошу прощения за, наверное, очень простой вопрос!

@page "/todo"

<h3>Todo (@todos.Count(todo => !todo.IsDone))</h3>

<ul>
    @foreach (var todo in todos)
    {
        <li>
            <input type="checkbox" @bind="todo.IsDone" />
            <input @bind="todo.Title" />
        </li>
    }
</ul>

<input placeholder="Something todo" @bind="newTodo" />
<button @onclick="AddTodo">Add todo</button>

@code {
    private IList<TodoItem> todos = new List<TodoItem>();
    private string newTodo;

    private void AddTodo()
    {
        if (!string.IsNullOrWhiteSpace(newTodo))
        {
            todos.Add(new TodoItem { Title = newTodo });
            newTodo = string.Empty;
        }
    }
}

1 Ответ

2 голосов
/ 25 мая 2020

Если вы посмотрите исходный код для 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.

...