0

ここで何かが欠けていると思いますが、これを機能させる方法を誰かが説明できますか

Func を受け取るメソッドがあります。メソッドでその func を実行し、結果をローカル変数に保存したいと考えています。

internal List<MembershipUser> Users;

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

これは動作しません。デリゲート型ではないため、Lambda を変換できないと書かれています。

何か案は?


ジェネリックの間違った使用については受け入れました、ありがとう。

これは私がそれを呼び出そうとしている方法です:

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

したがって、すでにラムダ式があり、結果を取得してローカル変数に格納するには Findtype が必要です。

繰り返しますが、おそらくポイントを逃していますが、ガイダンスは大歓迎です。

4

4 に答える 4

1

List<> (Users) 型の変数に式を代入しようとしています。

あなたは本当にこれをやりたいと思います:

Users = finder(Users)

それ自体ではあまり意味がありませんが。

于 2010-08-16T15:54:43.793 に答える
0

あなたが何をしているのかを正確に理解していなくても、構文が正しくなく、正しい数のパラメーターを渡していないことがわかります。

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

この場合、タイプを非常に厳密に制限しているため、ジェネリックの使用はまったく不要です。それらを削除すると、コードがより理解しやすくなる場合があります。

メソッドで何をしたいのかを正確に説明していただければ、コードを修正する方法についてより適切なガイダンスを提供できるはずです。

于 2010-08-16T15:56:31.140 に答える
0

x => finder(x)(匿名デリゲートなどのラムダ式) をUsers型 の変数に代入しようとしていますList<MembershipUser>。これは型の不一致です。

既存のユーザー リストをフィルター処理する場合 (これは、Users既に初期化されて入力されていることを前提としています)、コードを次のように変更します。

Users = finder(Users);

他のリストをフィルタリングしている場合は、次の行に沿って何かを行います

Users = finder(myUserList);

finderパラメータを必要とせずにリストを返すことになっている場合は、 a から aFunc<>に変更しますAction<>

void FindType<T>(Action<T> finder) where T : List<MembershipUser>
{
    Users = finder();
}
于 2010-08-16T15:53:26.463 に答える
0

MembershipUser の任意の Enumerable をローカル リストにフィルター処理したいと思います。したがって、フィルターは type にする必要があります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; }
            }
        }
    }
}
于 2010-08-16T17:53:36.190 に答える