列表匹配模式
C#11 中新增的 List Patterns 扩展了模式匹配的功能,可以用于匹配数组或列表中的元素序列。本文将介绍 List Patterns 的用法和示例,包括常量模式、类型模式、属性模式、关系模式、丢弃模式和范围模式。
# 基本语法
使用 List Patterns 的基本语法为:target is { element-pattern-list }
。其中,target
是要匹配的目标对象,可以是数组或列表;element-pattern-list
是由若干个元素模式组成的列表,用逗号分隔。
# 常量模式
常量模式可以用于匹配列表中的指定元素值。示例如下:
int[] numbers = { 1, 2, 3 };
if (numbers is { 1, 2, 3 })
{
Console.WriteLine("numbers 匹配成功");
}
# 类型模式
类型模式可以用于匹配列表中的指定类型的元素。示例如下:
object[] objs = { 1, "hello", DateTime.Now };
foreach (var item in objs)
{
if (item is string s)
{
Console.WriteLine($"字符串:{s}");
}
else if (item is int i)
{
Console.WriteLine($"整数:{i}");
}
else if (item is DateTime dt)
{
Console.WriteLine($"日期:{dt}");
}
}
# 属性模式
属性模式可以用于匹配列表中元素的属性值。示例如下:
class Person
{
public int Age { get; set; }
}
List<Person> persons = new()
{
new() { Age = 20 },
new() { Age = 30 },
new() { Age = 40 },
};
foreach (var p in persons)
{
if (p is { Age: > 30 })
{
Console.WriteLine($"年龄大于 30 的人:{p}");
}
}
# 关系模式
关系模式可以用于匹配列表中元素之间的关系。示例如下:
int[] numbers = { 1, 2, 3, 4, 5 };
if (numbers is { Length: > 3, [2]: > 2 })
{
Console.WriteLine("匹配成功");
}
上述代码中,Length: > 3
表示列表长度大于 3,[2]: > 2
表示列表中第三个元素的值大于 2。
# 丢弃模式
丢弃模式可以用于匹配列表中任意单个元素。示例如下:
int[] numbers = { 1, 2, 3 };
if (numbers is { _, 2, _ })
{
Console.WriteLine("匹配成功");
}
# 范围模式
范围模式可以用于匹配列表中的连续元素序列。示例如下:
int[] numbers = { 1, 2, 3, 4, 5 };
if (numbers is { ..2 } prefix && prefix is { Length: > 1 })
{
Console.WriteLine($"前缀为:{string.Join(", ", prefix)}");
}
上述代码中,..2
表示匹配前两个元素,prefix
是前两个元素构成的子列表,prefix is { Length: > 1 }
表示子列表长度大于 1。
# 总结
List Patterns 扩展了 C# 中模式匹配的功能,可以方便地匹配数组或列表中的元素序列。通过本文的介绍,相信读者已经对 List Patterns 有了初步的了解。如果想要了解更多的内容,可以参考微软官方文档中关于 pattern matching 的文章。
上次更新: 2023/04/26, 22:10:06