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

Mik*_*sen 1 .net c# lambda .net-3.5

问题:我刚刚使用c#lambda表达式编写了我的第一个代码.它有效,但我不确定这是否是最好的方法.关于更好地进行lambda表达式的任何建议?在表达式中有很多行代码似乎很奇怪,就像我在下面所做的那样.

背景:我有一个通用的代表列表.每个委托函数返回一个枚举值,指示函数中发生的事情.在评估委托时,我需要将枚举添加到List中,如果它不是特定的枚举值.

免责声明:这里的代码非常通用,真正的代码实际上在委托中确定返回值!


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

}
Run Code Online (Sandbox Code Playgroud)

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

CheckValues.ForEach(x => returnValue.Add(x()));
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

好的,一些建议:

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

    CheckValues.Add(method1);
    CheckValues.Add(method2);
    
    Run Code Online (Sandbox Code Playgroud)

    编译器将方法组转换为委托.

  • 我建议不要使用Pascal case来开始本地变量名.

  • 你的集合初始化器returnValues并没有真正为你做任何事情 - 只需List<T>正常调用构造函数,或者使用下面不需要局部变量的代码.
  • 如果您的列表真的只中有两名代表,我只是分别给他们打电话.它简单得多.
  • 否则你确实可以像Jared建议的那样使用LINQ,但我的做法略有不同:

    return CheckValues.Select(x => x())
                      .Where(wh => wh != WhatHappened.Nothing)
                      .ToList();
    
    Run Code Online (Sandbox Code Playgroud)

编辑:正如所建议的,这是完整的例子.虽然它与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();
}
Run Code Online (Sandbox Code Playgroud)

(我假设method1并且method2已经重命名以符合命名惯例.当然在现实生活中我确信他们还有更多有用的名字......)

  • 如果您举例说明您的代码,并询问我们将采取哪些不同的做法,那么我们如何才能知道您*所知道的错误与您*不知道的错误之间的区别? (2认同)