0

我目前正在构建一个处理IEnumerable<TSource>. 对于源集合中的每个项目,我需要产生一个或两个结果类型的项目。

这是我的第一种方法,但失败了,因为该方法被留在第一个 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();
    }
}

我将如何正确实施这种情况?

4

1 回答 1

2

您的解决方案应该有效。这是一个完整的示例程序,它演示了该方法的工作原理:

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();
        }
    }
}

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

于 2013-09-30T10:59:09.643 回答