问题:我刚刚使用 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();
}
(我假设 method1
和 method2
已重命名以符合命名约定。当然,在现实生活中,我确信它们无论如何都会有更有用的名字...)
关于c# lambda 表达式 - 将委托(delegate)结果添加到通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/782933/