Как вызвать Func для установки локального списка <> - PullRequest
0 голосов
/ 16 августа 2010

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

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

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

Итак, у меня уже есть выражение lamda. Мне просто нужен Findtype, чтобы получить результат и сохранить его в локальной переменной.

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

Ответы [ 4 ]

1 голос
/ 16 августа 2010

Вы пытаетесь присвоить выражение переменной типа List <> (Users).

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

Users = finder(Users)

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

0 голосов
/ 16 августа 2010

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

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

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

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

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

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; }
            }
        }
    }
}
0 голосов
/ 16 августа 2010

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

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

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

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

0 голосов
/ 16 августа 2010

Вы пытаетесь присвоить 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();
}
...