C# 是否可以取消选择和';继续';根据条件选择语句?
是否可以跳过在.Select方法中的选择,就像在fore..each中的“continue”一样C# 是否可以取消选择和';继续';根据条件选择语句?,c#,.net,linq,C#,.net,Linq,是否可以跳过在.Select方法中的选择,就像在fore..each中的“continue”一样 var myFoos = allFoos.Select (foo => { var platform = LoadPlatform(foo); if (platform == "
var myFoos = allFoos.Select (foo => {
var platform = LoadPlatform(foo);
if (platform == "BadPlatform") // TODO: should skip and continue
var owner = LoadOwner(foo);
// .... Som eother loads
});
您可以这样做:
var myFoos = allFoos
.Select (foo => new {Platform = LoadPlatform(foo), Foo = foo})
.Where(all => all.Platform != "BadPlatform")
.Select(all => {
var platform = all.Platform;//Not "BadPlatform"
var owner = LoadOwner(all.Foo);
// .... Som eother loads
});
var myFoos = allFoos
.Where(foo => LoadPlatform(foo) != "BadPlatform")
.Select(LoadOwner)
// ...continue with your other code
您应该使用
Where
来过滤掉不需要的元素。这在您当前的代码中是不可能的,但是有很多重构的空间。改写如下:
var myFoos = allFoos
.Select (foo => new {Platform = LoadPlatform(foo), Foo = foo})
.Where(all => all.Platform != "BadPlatform")
.Select(all => {
var platform = all.Platform;//Not "BadPlatform"
var owner = LoadOwner(all.Foo);
// .... Som eother loads
});
var myFoos = allFoos
.Where(foo => LoadPlatform(foo) != "BadPlatform")
.Select(LoadOwner)
// ...continue with your other code
如果“其他代码”也需要平台值,则应首先投影到匿名类型:
var myFoos = allFoos
.Select(foo => new { Platform = LoadPlatform(foo), Foo = foo })
.Where(o => o.Platform != "BadPlatform")
.Select(o => new { Platform = o.Platform, Owner = LoadOwner(o.Foo), ... })
// ...continue with your other code
通常,如果可能的话,应该避免在这种lambda中编写块表达式;块表达式会产生难以编写的僵硬代码。a
aWhere
beforeSelect
?但我正在Select中加载平台。@pencilCake-我不确定你的意思-你的测试是针对你正在加载的平台进行的。在不先加载的情况下,如何检查条件?