Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何实现对每个输入值产生两个结果的扩展方法?_C#_Yield Return - Fatal编程技术网

C# 如何实现对每个输入值产生两个结果的扩展方法?

C# 如何实现对每个输入值产生两个结果的扩展方法?,c#,yield-return,C#,Yield Return,我目前正在构建一个扩展方法,用于处理IEnumerable。对于源集合中的每个项,我需要生成一个或两个结果类型的项 这是我的第一种方法,它失败了,因为该方法被留在第一个return语句上,而在第二个return语句被命中时忘记了它的状态 public static IEnumerable<TResult> DoSomething<TSource>(this IEnumerable<TSource> source) where TResult : new

我目前正在构建一个扩展方法,用于处理
IEnumerable
。对于源集合中的每个项,我需要生成一个或两个结果类型的项

这是我的第一种方法,它失败了,因为该方法被留在第一个return语句上,而在第二个return语句被命中时忘记了它的状态

public static IEnumerable<TResult> DoSomething<TSource>(this IEnumerable<TSource> source)
    where TResult : new()
{
    foreach(item in source)
    {
        if (item.SomeSpecialCondition)
        {
            yield return new TResult();
        }
        yield return new TResult();
    }
}
公共静态IEnumerable剂量测量(此IEnumerable源)
其中TResult:new()
{
foreach(源中的项)
{
if(项目某些特殊条件)
{
返回新的TResult();
}
返回新的TResult();
}
}

如何正确实施此方案?

您的解决方案应该有效。下面是一个完整的示例程序,演示了该方法的有效性:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    class Program
    {
        void run()
        {
            var test = DuplicateOddNumbers(Enumerable.Range(1, 10));

            foreach (var n in test)
                Console.WriteLine(n);
        }

        public IEnumerable<int> DuplicateOddNumbers(IEnumerable<int> sequence)
        {
            foreach (int n in sequence)
            {
                if ((n & 1) == 1)
                    yield return n;

                yield return n;
            }
        }

        static void Main(string[] args)
        {
            new Program().run();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
名称空间演示
{
班级计划
{
无效运行()
{
var测试=重复的数字(可枚举范围(1,10));
foreach(测试中的var n)
控制台写入线(n);
}
公共IEnumerable DuplicateOddNumber(IEnumerable序列)
{
foreach(按顺序输入n)
{
如果((n&1)==1)
收益率n;
收益率n;
}
}
静态void Main(字符串[]参数)
{
新程序().run();
}
}
}

另外,请注意Dmitry Dovgopoly关于使用正确的TSource和TResult的评论。

我不明白为什么这不起作用。。。我一定是误解了。是的,我实际上在一个简单的例子上测试了它,它是有效的。
DoSomething
foreach(源代码中的var项)
。其他一切都还可以。我看不出任何问题,但是一次迭代可以产生两个项目,因此有可能项目的数量不一样。Hmpf。我将尝试创建一个示例来演示这个问题…你是对的-我在第一个(“稍微”复杂一些)实现中显然遗漏了一些东西。。。