首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#,将case语句转换为yield语句

基础概念

switch语句和yield关键字在C#中都是用于控制程序流程的重要结构,但它们的用途和行为有所不同。

  • switch语句是一种多路分支选择结构,它允许你基于一个表达式的值执行不同的代码块。
  • yield关键字通常用于生成器方法中,它允许方法按需生成序列的值,而不是一次性生成所有值并返回一个集合。

转换优势

switch语句转换为使用yield可以带来以下优势:

  1. 延迟执行:使用yield可以按需生成值,这在处理大量数据或无限序列时非常有用,因为它可以节省内存和提高性能。
  2. 可读性和维护性:在某些情况下,使用yield可以使代码更加简洁和易读。

类型

  • switch语句是一种控制流语句。
  • yield关键字用于生成器方法中,返回一个IEnumerable<T>类型的序列。

应用场景

当你需要根据某个条件生成一系列值,并且希望这些值是按需生成的时候,可以考虑使用yield

示例代码

假设我们有一个switch语句,根据不同的输入返回不同的字符串序列:

代码语言:txt
复制
public IEnumerable<string> GetStringSequence(int input)
{
    switch (input)
    {
        case 1:
            yield return "One";
            yield return "First";
            break;
        case 2:
            yield return "Two";
            yield return "Second";
            break;
        default:
            yield return "Other";
            break;
    }
}

遇到的问题及解决方法

问题:为什么不能直接将switch语句中的每个case块替换为yield return

原因switch语句的结构不允许直接在其中使用yield return,因为switch块必须在编译时就确定其执行路径,而yield return是用于延迟执行的。

解决方法:将整个switch语句放入一个生成器方法中,如上面的示例代码所示。

参考链接

通过这种方式,你可以有效地将switch语句转换为使用yield的生成器方法,从而实现按需生成序列的值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C#学习笔记之一】C#中的关键字

下面是列出的所有的关键字在 C# 程序的任何部分都是保留标识符: abstract as base bool break byte case catch char checked class const...除了下表中引用的主题中介绍的以外,语句都是按照顺序执行的。 下表列出了 C# 语句关键字。 有关不用任何关键字表示的语句的更多信息,请参见语句C# 编程指南)。...类别 C# 关键字 选择语句 if, else, switch, case 迭代语句 do, for, foreach, in, while 跳转语句 break, continue, default,... goto,return,yield 异常处理语句 throw, try-catch, try-finally, try-catch-finally 检查和未检查 checked, unchecked...where 约束添加到泛型声明。(另请参见where)。 yield 在迭代器块中使用,用于向枚举数对象返回值或发信号结束迭代。 C# 3.0 中引入的所有查询关键字也都是上下文相关的。

2.4K50
  • C#8.0 新增功能

    C# 7.0 通过使用 is表达式和 switch 语句引入了类型模式和常量模式的语法。 这些功能代表了支持数据和功能分离的编程范例的初步尝试。...Switch 表达式 通常情况下,switch 语句在其每个 case 块中生成一个值。 借助 Switch 表达式 ,可以使用更简洁的表达式语法。...不同的顺序使得在视觉上可以很轻松地区分 switch 表达式和 switch 语句 case 和 : 元素替换为 =>。 它更简洁,更直观。 default 事例替换为 _ 弃元。...在这两种情况下,编译器生成对 Dispose() 的调用。 如果 using 语句中的表达式不可处置,编译器生成一个错误。...该方法包含用于在异步流中返回连续元素的 yield return 语句。 使用异步流需要在枚举流元素时在 foreach 关键字前面添加 await 关键字。

    87730

    C#7.0中有哪些新特性?

    以下将是 C# 7.0 中所有计划的语言特性的描述。随着 Visual Studio “15” Preview 4 版本的发布,这些特性中的大部分活跃起来。...在 C#7.0,我们正在加强两个现有的具有模式的语言结构: is 表达式现在具有一种右手侧的模式,而不仅仅是一种类型 switch 语句中的 case 语句现在可以使用匹配模式,不只是常数值 在 C#的未来版本中...我们正在归纳 Switch 语句: 可以设定任何类型的 Switch 语句(不只是原始类型) 模式可以用在 case 语句Case 语句可以有特殊的条件 下面是一个简单的例子: switch(shape...:就像 catch 语句一样,case 语句的范围现在可以相交,第一个匹配上的会被选中。...此外,就像 catch 语句一样,编译器通过去除明显不会进入的 case 来帮助你。在此之前,你甚至不需要告诉判断的顺序,所以这并不是一个使用 case 语句的巨大的改变。

    1.6K80

    C#2.0新增功能05 迭代器

    迭代器方法使用 yield return 语句返回元素,每次返回一个。 到达 yield return 语句时,会记住当前在代码中的位置。 下次调用迭代器函数时,将从该位置重新开始执行。...可以使用 yield break 语句来终止迭代。...Push 方法值分配给类型为 T 的数组。 GetEnumerator 方法通过使用 yield return 语句返回数组值。...必须存在从 yield return 语句中的表达式类型到迭代器返回的 IEnumerable 类型参数的隐式转换。 在 C# 中,迭代器方法不能有任何 in、ref 或 out 参数。...在 C# 中,“yield”不是保留字,只有在 return 或 break 关键字之前使用时才有特殊含义。 技术实现 即使迭代器编写成方法,编译器也会将其转换为实际上是状态机的嵌套类。

    72150

    scala 学习笔记

    控制语句(表达式) Scala中支持if、while、for comprehension(for表达式)、match case(模式匹配)四大主要控制语句。Scala不支持switch和?...:两种控制语句,但它的if和match case会有更好的实现。 if Scala支持if语句,其基本使用和Java、Python中的一样。但不同的时,它是有返回值的。...通常的for语句如下: for (变量 <- 集合) { 语句块 } Scala中for表达式除了上面那样的常规用法,它还可以使用yield关键字集合映射为另一个集合: scala> val list...但与switch需要使用break明确告知终止之后的判断不同,Scala中的match case是默认break的。只要其中一个case语句匹配,就终止之后的所以比较。...且对应case语句的表达式值将作为整个match case表达式的值返回。 集合 在Scala中,常用的集合类型有:List、Set、Map、Tuple、Vector等。

    56120

    C#中ref和out的区别使用

    例如,如果调用方传递本地变量表达式或数组元素访问表达式,所调用方法会将对象替换为 ref 参数引用的对象,然后调用方的本地变量或数组元素开始引用新对象。...迭代器方法,包括 yield return 或 yield break 语句。 示例 前面的示例演示当通过引用传递值类型时会发生什么情况。 你还可以使用 ref 关键字传递引用类型。...通过引用传递引用类型可以使所调用方法调用方法中的对象替换为引用参数所引用的对象。 对象的存储位置按引用参数的值传递到方法。...如果更改参数存储位置中的值(以指向新对象),你还可以存储位置更改为调用方所引用的位置。 下面的示例引用类型的实例作为 ref 参数传递。...迭代器方法,包括 yield return 或 yield break 语句。 如果希望方法返回多个值,可以声明 out 方法。下面的示例使用 out 返回具有单个方法调用的三个变量。

    1.1K51

    理解 ES6 generator

    后面的值可以通过 next 方法得到,那 yield 语句本身有没有返回值或者 yield 语句返回值如何得到呢?...来看以下代码: gen = gen(); // 转换为 generator 对象 var g = gen.next(); // 第一步启动 var firstStep = g.value; // 取得第一个...函数.而对于 yield + promise 结合的异步流程控制, 核心思想就是通过 next 函数取得 yield 后面的值, 然后这个值转化为 Promise, 通过 Promise 来控制异步任务...与下一个 yield 之间的代码被放到 switch 语句的中一个 case 中去, 然后根据一个闭包中的状态变量 state 执行一个个 case.然后 switch 包含在一个类似 progress...next 函数通过判断 state 的值, 不断 state 值改变, 比如当 state 为 1 时, 执行 progress case 为 1 的逻辑, 然后修改 state 为 2(下一个状态

    22110

    yield关键字看IEnumerable和Collection的区别

    C#yield关键字由来以久,如果我没有记错的话,应该是在C# 2.0中被引入的。相信大家此关键字的用法已经了然于胸,很多人也了解yield背后的“延迟赋值”机制。...在Main方法中,GetVetors方法的返回值赋值给一个变量,然后对每一个Vector对象的X和Y进行重新赋值,最后每一个Vector的信息输出来。...为了避免不必要的计算导致的性能损失,和LINQ查询一样,yield关键字并不会导致后值语句的立即执行,而是转换成一个“表达式”。只有等到需要的那一刻(进行迭代)的时候,表达式被才被执行。...我我们只需要在Vector的构造函数中添加一行语句:Console.WriteLine("Vector object is instantiated.");。...甚至说,我们应该IEnumerable对象当成“只读”的,如果我们需要“可写”的功能,你应该使用数组或者集合类型。

    78780

    探索 yield 关键字

    引言 「yield」关键字是 C# 中的一种语言特性,用于在枚举器中简化迭代器的实现。...使用 yield 关键字,可以迭代器中的值一次一个地返回,而不必使用一个集合对象存储所有的值。...当执行到yield return语句时,代码将会暂停执行,返回值传递给迭代器的调用者,并将迭代器的状态保存下来。...紧接着,我们使用 yield return 语句生成的整数返回给调用方。 要注意调用时使用异步迭代器(具有 await 关键字的foreach)来进行遍历>。...总结 使用 yield 关键字可以一个方法转换为一个返回可枚举对象或迭代器的方法,而不必手动实现 IEnumerable 和 IEnumerator 接口 使用 yield 来创建异步生成器,在某些场景下可以实现更高效

    17020

    C# 7.0 探索之旅

    C# 7.0 中我们用模式改进了两个已有的语言结构: is 表达式的右边现在可以是表达式,而不仅仅是类型了 switch 语句中的 case 子句现在可以匹配模式,而不仅仅是常量了 在未来的 C#...我们正在使 switch 语句一般化,因此: 你可以筛选任意类型(不仅仅是原生类型) 模式可以被用在 case 子句中 Case 子句可以有额外的限制条件 这是个简单的例子: switch(shape...null: throw new ArgumentNullException(nameof(shape)); } 关于这个新扩展的 switch 语句有一些需要注意的事项: 现在 case...一个_解构声明(deconstructing declaration__)_是一种用来一个元组(或其他值类型)分成许多部分并将这些部分分别转换为全新的变量的语法: (string first, string...同时,C# 7.0 引入了二进制字面量(binary literals),这样你可以直接指定位模板而不用十六进制记号牢记于心。

    1.3K90
    领券