【问题标题】:Nested yield returns collection instead of string嵌套的 yield 返回集合而不是字符串
【发布时间】:2020-06-14 14:37:56
【问题描述】:

我尝试使用 yield 在每次迭代时返回字符串,但我的res 不是字符串,而是{Namespace.Class.<getMutations>d__10} 类型。我得到了我想要的所有结果,但它们是一次性返回的,而不是一一返回。我做错了什么?

public static IEnumerable<string> generate(string mask)
{
     foreach (List<string> pattern in list)
     {
         var res = getMutations(pattern);
         yield return "result:  " + res;
     }
}

private static IEnumerable<string> getMutations(List<string> pattern)
{
    IEnumerable<string> mutations = null;
    switch (pattern.Count)
    {               
        case 4:
            mutations =
            from m0 in pattern[0]
            from m1 in pattern[1]
            from m2 in pattern[2]
            from m3 in pattern[3]
            select "" + m0 + m1 + m2 + m3;
            break;
        case 5:
            mutations =
            from m0 in pattern[0]
            from m1 in pattern[1]
            from m2 in pattern[2]
            from m3 in pattern[3]
            from m4 in pattern[4]
            select "" + m0 + m1 + m2 + m3 + m4;
            break;
    }

    foreach (var mutation in mutations)
        yield return mutation;
}

【问题讨论】:

  • 您希望res 拥有什么类型?
  • 我希望收到一个字符串
  • foreachres 然后yieldforeach 内。
  • resIEnumerable&lt;string&gt; 类型,因为您的方法正在返回一个集合。
  • 还要考虑完全避免在第一种方法中使用yield return。我强烈怀疑您可以使用 LINQ(Select 可能还有 SelectMany)来实现它。

标签: c# yield-return


【解决方案1】:

我很想回答你这个问题,但我找到了一个更好、更完整的答案,你可以在下面的链接中找到。

What is the yield keyword used for in C#?

为此,您需要了解延迟执行

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/deferred-execution-example

【讨论】:

    【解决方案2】:

    在每次迭代中,您都会返回 getMutations 的结果,这是一个可枚举的。 如果要返回字符串,则必须遍历 getMutations 的结果并生成这些字符串。

    【讨论】:

    • 但是在 getMutations 里面我有循环遍历所有字符串,并一个一个地返回它们(或者至少应该)
    • 如果不返回集合,您无法在 .NET 中逐一返回内容,所以基本上,您正在返回一个集合。 yield return 只是语法糖和编译器重写的一些有用的代码,以便更容易编写这种“返回集合”类型的东西。但是您正在返回一个集合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2019-09-15
    • 2014-07-28
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多