C# 在Switch表达式中是否有跳过或继续的方法,或者每个分支是否都需要返回某些内容?
仅当switch表达式发现如下内容时,我才想添加到列表中:C# 在Switch表达式中是否有跳过或继续的方法,或者每个分支是否都需要返回某些内容?,c#,.net,C#,.net,仅当switch表达式发现如下内容时,我才想添加到列表中: List<drivedType> derivedObjects = new() derivedObjects.Add(baseObject switch { derivedType d when d.field != 1 => d, _ => // Here I would put somthing like "continue" but it's not accepted
List<drivedType> derivedObjects = new()
derivedObjects.Add(baseObject switch
{
derivedType d when d.field != 1 => d,
_ => // Here I would put somthing like "continue" but it's not accepted
});
List derivedObjects=new()
添加(baseObject开关
{
当d.field!=1=>d时,derivedType d,
_=>//这里我会放一些类似“继续”的东西,但它不被接受
});
有类似的可能吗
在这里,我会放一些东西,比如continue
否继续
,开关表达式是一个表达式,它必须返回一些内容
C#中唯一的例外是允许抛出这些表达式(switch
表达式、条件表达式等),就像函数允许抛出而不是返回值一样。所以你可以这样做,事实上这是一种非常常见的模式:
derivedObjects.Add(baseObject switch
{
derivedType d when d.field != 1 => r,
_ => throw new InvalidOperationException()
});
编辑:以防您不知道,实际上有一种更简单的方法来编写代码,而不必在时使用:
derivedObjects.Add(baseObject switch
{
derivedType { field: not 1 } d => r,
_ => throw new InvalidOperationException()
});
最好使用switch语句,而不是switch表达式
List derivedObjects=new()
开关(基本对象)
{
当d.field!=1时,案例派生类型d:
衍生对象。添加(d);
打破
违约:
打破
}
即,当值符合要求时,添加它,否则不添加。但由于只有一个有效的case,if语句似乎比switch语句更合适。当不在案例标签内时,必须使用is
关键字引入模式:baseObject is pattern\u expression
在C#9.0中,您还可以使用新的
case-derivedType{field:<1或>1}d:
不清楚此代码试图做什么。它可能是试图按类型筛选对象列表的代码片段。它可能是基于类型插入单个对象的尝试。或者完全不同的东西
如果目的是按类型过滤对象列表,则可以使用LINQ过滤并创建最终列表:
var derivedObjects= baseObjects.OfType<DerivedObject>()
.Where(d=>d.Field !=1)
.ToList();
所有表达式都必须返回一个值。在默认情况下,Add
会做什么?使用LINQ会更容易/更清晰吗?或者我遗漏了什么吗?baseObject
来自哪里?如果它来自列表或IEnumerable,则Where().Select().ToList()
可以替换此代码。如果只有一个实例,最好使用If子句
,如果条件满足,则只使用Add
succeeded@maccettura不知道如何使用LINQ,你能发布答案吗,我可以接受。抱歉,我还在学习。这很像是想把一个方形的钉子塞进一个圆孔。switch表达式的美妙之处在于,它们确实能为每种情况提供回报。如果这不是您想要实现的,那么您选择了错误的peg。最好使用If
并且不要添加任何内容。如果您的用例中出现了条件失败的情况,那么在某些情况下,您必须使用自定义代码来支持每个单独的项目(如这里的示例),任何你不支持的都是一个错误,不能默默忽略。在这个问题上,似乎所有可能的C#9功能都被使用了,不管它们是否合适。
var derivedObjects= baseObjects.OfType<DerivedObject>()
.Where(d=>d.Field !=1)
.ToList();
if(baseObject is DerivedType d && d.Field !=1)
{
derivedObjects.Add(d);
}