Как вызвать фанк, чтобы установить локальный список <>

StackOverflow https://stackoverflow.com/questions/3494830

  •  29-09-2019
  •  | 
  •  

Вопрос

Я думаю, что я что-то упускаю здесь, но может ли кто-нибудь объяснить, как я могу получить это на работу

У меня есть метод, который принимает функцию, который требуется функция, я хочу выполнить этот функцию в методе хранить результат в локальном VAR.

internal List<MembershipUser> Users;

internal void FindType<T>(Func<List<MembershipUser>, T> finder) where T : 
    List<MembershipUser>
{
     Users = x => finder(x);
}

Это не работает. Он говорит, что не может преобразовать лямбда, так как это не тип делегата.

Любые идеи?


ОК, приняты о неправильном использовании дженериков, спасибо.

Вот как я пытаюсь это позвонить:

FindType<List<MembershipUsers>>(
    members => 
    { 
        return members.Where(member => member.IsApproved).ToList<MembershipUser>(); 
    };

Поэтому у меня уже есть Exprsion My Lamda, мне просто нужно FindType, чтобы получить результат и хранить его в локальной переменной.

Опять же, я, наверное, упущен точку, но руководство очень ценится.

Это было полезно?

Решение

Я думаю, что вы хотите попытаться отфильтровать произвольный перечисление члена в локальный список. Поэтому ваш фильтр должен быть тип Func<IEnumerable<MembershipUser>, List<MembershipUser>>. Анкет Кроме того, одна вещь отсутствует: этот список, который вы пытаетесь фильтровать. Это должно быть передано как параметр на фильтр при его вызове. Я предполагаю, что это передается как параметр, но он может так же легко быть другой внутренней переменной или свойством вашего класса.

Это приводит к следующей функции (см. Ниже для полного рабочего образца):

void FindType(Func<IEnumerable<MembershipUser>, List<MembershipUser>> filter, IEnumerable<MembershipUser> list)
{
   Users = filter(list);
}

Что -то, что я узнал из моих курсов по функциональному программированию в университете: сначала получите правильные типы, чем остальные последуют. Подумайте о том, что вы пытаетесь сделать с точки зрения входов и выходов. Не только для ваших функций, но и для ваших Lambdas. (Которые по сути являются безымянными функциями).

Полный рабочий образец:

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Sample d = new Sample();
            IEnumerable<MembershipUser> ll = new List<MembershipUser>()
            {
                new MembershipUser() { Name ="1", IsApproved=false},
                new MembershipUser() { Name ="2", IsApproved=true},
            };

            d.FindType(members => members.Where(m => m.IsApproved).ToList(), ll);
            Console.WriteLine(d.Users.Count());
        }

        class MembershipUser
        {
            public string Name
            {get;set;}
            public bool IsApproved
            {get;set;}
        }

        class Sample
        {
            private List<MembershipUser> users;

            public void FindType(Func<IEnumerable<MembershipUser>, List<MembershipUser>> filter, IEnumerable<MembershipUser> list)
            {
                users = filter(list);
            }

            public List<MembershipUser> Users
            {
                get { return users; }
            }
        }
    }
}

Другие советы

Вы пытаетесь назначить выражение переменной списка типов <> (пользователи).

Я подозреваю, что вы действительно хотите сделать это:

Users = finder(Users)

Хотя это не имеет большого смысла самостоятельно.

Не понимая точно, что вы делаете, я могу сказать вам, что ваш синтаксис выключен, и вы не передаете правильное количество параметров:

internal void FindType<T>(Func<List<MembershipUser>, T> finder, T x)
    where T : List<MembershipUser>
{
    Users = finder(T);
}

В этом случае, поскольку вы ограничиваете тип так строго, использование дженериков довольно лишнее. Удаление их может сделать ваш код более понятным.

Если вы объясните именно то, что вы хотите, чтобы метод сделать, мы сможем дать вам лучшее руководство как для исправления кода.

Вы пытаетесь назначить x => finder(x) (выражение лямбда, например, анонимный делегат) Users, переменная типа List<MembershipUser>. Анкет Это несоответствие типа.

Если вы хотите отфильтровать список существующих пользователей (это предполагает, что Users уже инициализирован и заполнен), затем измените свой код на

Users = finder(Users);

Если вы фильтруете какой -то другой список, то сделайте что -нибудь в соответствии с

Users = finder(myUserList);

Если finder должен вернуть список, не требуя каких -либо параметров, затем измените его с Func<> для Action<>

void FindType<T>(Action<T> finder) where T : List<MembershipUser>
{
    Users = finder();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top