c# lambda 表达式 - 将委托(delegate)结果添加到通用列表

标签 c# .net .net-3.5 lambda

问题:我刚刚使用 C# lambda 表达式编写了我的第一个代码。它有效,但我不确定这是否是最好的方法。关于更好地执行 lambda 表达式的方法有什么建议吗?像下面这样在表达式中包含大量代码行似乎很奇怪。

背景:我有一份通用的代表名单。每个委托(delegate)函数都会返回一个枚举值,指示函数中发生的事情。在评估委托(delegate)时,如果枚举不是特定的枚举值,我需要将其添加到列表中。

免责声明:这里的代码非常通用,真正的代码实际上在委托(delegate)中做一些事情来确定返回值!


class Class1
{
    public enum WhatHappened
    {
        ThingA,
        ThingB,
        Nothing
    }

    private delegate WhatHappened del();

    public static List<WhatHappened> DoStuff()
    {
        List<del> CheckValues = new List<del>();

        List<WhatHappened> returnValue = new List<WhatHappened> { };

        CheckValues.Add(delegate { return method1(); });
        CheckValues.Add(delegate { return method2(); });

        CheckValues.ForEach(x =>
        {
            WhatHappened wh = x();
            if (wh != WhatHappened.Nothing)
                returnValue.Add(wh);
        });

        return returnValue;

    }

    private static WhatHappened method1()
    {
        return WhatHappened.Nothing;
    }

    private static WhatHappened method2()
    {
        return WhatHappened.ThingA;
    }

}

注意:我最初让 lambda 喜欢添加所有项目(见下文),然后删除我不想要的项目(WhatHappened.Nothing)。

CheckValues.ForEach(x => returnValue.Add(x()));

最佳答案

好的,一些建议:

  • 不要调用你的代表 del .在这种情况下,我会使用 Func<WhatHappened> - 但如果您确实想要声明您自己的委托(delegate)类型,请给它一个更具描述性的名称,并遵守 .NET 命名约定。
  • 而不是使用匿名方法添加到CheckValues ,你可以只使用:

    CheckValues.Add(method1);
    CheckValues.Add(method2);
    

    编译器会将方法组转换为委托(delegate)。

  • 我建议不要使用 Pascal 大小写作为局部变量名称的开头。

  • returnValues 的集合初始值设定项|并没有真正为您做任何事情 - 只需调用 List<T>像往常一样构造函数,或者使用我下面的代码,它不需要局部变量作为开头。
  • 如果您的列表真的只有两个委托(delegate),我会分别调用它们。这要简单得多。
  • 否则,您确实可以按照 Jared 的建议使用 LINQ,但我会稍作不同:

    return CheckValues.Select(x => x())
                      .Where(wh => wh != WhatHappened.Nothing)
                      .ToList();
    

编辑:按照建议,这是完整的示例。虽然它和 Denis 的不太一样......我做了一些改变:)

public static List<WhatHappened> DoStuff()
{
    var functions = new List<Func<WhatHappened>> { Method1, Method2 };

    return functions.Select(function => function())
                    .Where(result => result != WhatHappened.Nothing)
                    .ToList();
}

(我假设 method1method2 已重命名以符合命名约定。当然,在现实生活中,我确信它们无论如何都会有更有用的名字...)

关于c# lambda 表达式 - 将委托(delegate)结果添加到通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/782933/

相关文章:

c# - try catch 验证空文本框

c# - 如何处理阻塞的剪贴板和其他异常情况

c# - 如何订购匿名类型的 IEnumerable<T>?

c# - 用户控件运行时宽度和高度

C# Linq to SQL - IEnumerable 连接两个数据表/上下文

c# - 如何将 DistinctRootEntityResultTransformer 应用于 NHibernate 中的所有查询

c# - 如何用动画改变形式?

c# - 如何获取 Sql Server 数据库中所有模式的列表

c# - 从资源文件读取 Cursor 时抛出 ArgumentException

C#数学类问题