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)
好的,一些建议:
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已经重命名以符合命名惯例.当然在现实生活中我确信他们还有更多有用的名字......)
| 归档时间: |
|
| 查看次数: |
3752 次 |
| 最近记录: |