2

只有当 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
});

有什么可能吗?

4

3 回答 3

4

目前尚不清楚这段代码试图做什么。它可能是尝试按类型过滤对象列表的代码片段。这可能是尝试根据类型插入单个对象。或者完全不同的东西。

如果打算按类型过滤对象列表,则可以使用 LINQ 过滤创建最终列表:

var derivedObjects= baseObjects.OfType<DerivedObject>()
                               .Where(d=>d.Field !=1)
                               .ToList();

如果打算插入单个对象:

if(baseObject is DerivedType d && d.Field !=1)
{
    derivedObjects.Add(d);
}
于 2021-01-05T20:04:31.370 回答
2

最好使用 switch 语句而不是 switch 表达式来完成

List<drivedType> derivedObjects = new()

switch(baseObject)
{
    case derivedType d when d.field != 1:
        derivedObjects.Add(d);
        break;
    default:
        break;
}

即,当该值符合需要时,添加它,否则不添加。但是由于您只有一个有效案例,因此 if 语句似乎比 switch 语句更合适。is当不在 case 标签内时,您必须使用关键字来引入模式:baseObject is pattern_expression

在 C# 9.0 中,您还可以使用新的关系和析取模式

case derivedType { field: < 1 or > 1 } d:
于 2021-01-05T20:03:39.220 回答
2

在这里我会放一些东西continue

continue,switch 表达式是一个表达式,它必须返回一些东西。

C# 中的唯一例外是这些表达式(switch表达式、条件表达式等)被允许抛出,就像函数被允许抛出而不是返回值一样。所以你可以做这样的事情,确实这是一个非常常见的模式:

derivedObjects.Add(baseObject switch
{
    derivedType d when d.field != 1 => r,
    _ => throw new InvalidOperationException()
});

编辑:以防万一你不知道,实际上有一种更简单的方法来编写你的代码,没有那个when

derivedObjects.Add(baseObject switch
{
    derivedType { field: not 1 } d => r,
    _ => throw new InvalidOperationException()
});
于 2021-01-05T19:54:55.090 回答