如何将代表存储在列表中

Posted

技术标签:

【中文标题】如何将代表存储在列表中【英文标题】:How to store delegates in a List 【发布时间】:2010-09-28 13:36:51 【问题描述】:

如何将委托(命名、匿名、lambda)存储在通用列表中?基本上我正在尝试构建一个委托字典,从中我可以使用一个键访问存储的委托并执行它并按需返回值。可以在 C# 4 中做吗?有什么想法来完成它吗? 注意:在我可以存储任何类型的代表的地方,最好使用异构列表。

【问题讨论】:

注意异构是一个坏主意,你怎么知道你应该传递代表什么参数 【参考方案1】:

System.Collections.Generic.Dictionary<string, System.Delegate> 还不够吗?

【讨论】:

这样我就不能存储匿名委托或 lambdas。 @Anindya Chatterjee:是的,你可以:dic.Add("action", new Action(() => Console.WriteLine("action called!"))); 是的,谢谢你提醒我,我完全忘记了 --new Action(() => Console.WriteLine("action called!"))--【参考方案2】:

好吧,这是一个简单的例子:

class Program

    public delegate double MethodDelegate( double a );

    static void Main()
    
        var delList = new List<MethodDelegate> Foo, FooBar;


        Console.WriteLine(delList[0](12.34));
        Console.WriteLine(delList[1](16.34));

        Console.ReadLine();
    

    private static double Foo(double a)
    
        return Math.Round(a);
    

    private static double FooBar(double a)
    
        return Math.Round(a);
    

【讨论】:

我不是在寻找这种解决方案。该解决方案只需要一种特殊的命名委托,而不是其他的。【参考方案3】:
    public delegate void DoSomething();

    static void Main(string[] args)
    
        List<DoSomething> lstOfDelegate = new List<DoSomething>();
        int iCnt = 0;
        while (iCnt < 10)
        
            lstOfDelegate.Add(delegate  Console.WriteLine(iCnt); );
            iCnt++;
        

        foreach (var item in lstOfDelegate)
        
            item.Invoke();
        
        Console.ReadLine();
    

【讨论】:

【参考方案4】:
List<System.Delegate> something;
something.Add(new Action(()=> DoSomething()));

如果你想自定义key,你可以使用上面的字典

【讨论】:

【参考方案5】:
        Dictionary<string, Func<int, int>> fnDict = new Dictionary<string, Func<int, int>>();
        Func<int, int> fn = (a) => a + 1;
        fnDict.Add("1", fn);
        var re = fnDict["1"](5);

【讨论】:

我正在寻找一个对代表没有限制的更通用的解决方案。

以上是关于如何将代表存储在列表中的主要内容,如果未能解决你的问题,请参考以下文章

将代表存储在字典中

如何将 csv 文件读入 SWI prolog 中的列表列表,其中内部列表代表 CSV 的每一行?

如何将元组列表转换为 pandas 数据框,以便每个元组的第一个值代表一列?

将复选框动态添加到列表视图

TCL:变量存储一个代表浮点数的十六进制值,如何将它作为浮点数显示在屏幕上?

如何使用java-script和jquery为列表中重复单击的标签存储类名?