Нужна помощь с использованием функции делегата c# - PullRequest
0 голосов
/ 04 апреля 2020
delegate bool Function(int num);
static Function GreatThan10 = delegate(int n){return n >= 10; };    //there is error  

class Program
{

    static List<int> Traverse(List<int> myList, Function function)
    {
        var list = new List<int>();
        foreach (var item in myList)
        {
            if (function(item))
            {
                list.Add(item);
            }

        }
        return list;
    }       

Когда я использую делегат c#, обнаруживается ошибка. Кроме того, я хочу знать, что его делегат такой же, как php функция обратного вызова?

Я только учусь c# и чувствую его ресурс относительно мусором, чем JAVA. Я хочу глубоко учиться с книгами. Есть ли хорошие книги, которые можно мне порекомендовать?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Ваша декларация delegate просто показывает форму, которую должна иметь функция для того, чтобы квалифицировать ее как вход, где существует Function. Вам не нужно объявлять саму функцию в качестве делегата. Это может быть просто обычная функция:

static bool GreatThan10(int n) 
{ 
    return n >= 10; 
}

Затем вы можете передать ее в качестве аргумента в Traverse, например:

var bigNumbers = Traverse(new List<int> {1, 10, 100}, GreatThan10);
0 голосов
/ 04 апреля 2020

Вам просто нужно переместить поле GreatThan10 в вашей программе класса. Первая строка вашего кода просто для определения нового делегата, который принимает параметр int и возвращает bool. Вместо этого GreatThan10 является ссылкой на этот тип делегата, поэтому он должен быть членом класса.

Вы также спросили, совпадает ли делегат с функциями обратного вызова PHP. Я бы сказал, что делегат - это тип, представляющий ссылку на методы. Вы объявляете его с некоторыми параметрами и с типом возврата, а затем можете создавать новые ссылки на этот делегат, которые указывают на некоторые методы с тем же типом параметров и типом возврата.

Попробуйте это решение, и у вас не должно возникнуть проблем.

using System;
using System.Collections.Generic;

delegate bool Function(int n);

class Program
{
    static Function GreatThan10 = delegate(int n) { return n > 10; };

    static void Main(string[] args)
    {
        List<int> list = new List<int>();

        Traverse(list, GreatThan10);

        Console.ReadKey();
    }

    static List<int> Traverse(List<int> myList, Function function)
    {
        var list = new List<int>();
        foreach (var item in myList)
        {
            if (function(item))
            {
                list.Add(item);
            }

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