LINQ:如何根据上下文修改AsParallel的返回类型?

时间:2011-11-07 21:54:42

标签: c# .net linq plinq

LINQ的AsParallel返回ParallelQuery。我想知道是否可以改变这种行为,以便我可以比较LINQ语句运行与没有并行而不用实际更改代码?此行为应类似于Debug.Assert - 如果未设置DEBUG预处理程序指令,则会对其进行优化。因此,我希望能够使AsParallel返回相同的类型而不将其转换为ParallelQuery

我想我可以声明自己的扩展方法(因为我无法覆盖AsParallel)并在其中分析了预处理器指令:

    public static class MyExtensions
    {
#if TURN_OFF_LINQ_PARALLELISM
        public static IEnumerable<T> AsControllableParallel<T>(this IEnumerable<T> enumerable)
        {
            return enumerable;
        }
#else
        public static ParallelQuery<T> AsControllableParallel<T>(this IEnumerable<T> enumerable)
        {
            return enumerable.AsParallel();
        }
#endif
    }

我想知道是否还有其他办法。我要求的太多了吗?

2 个答案:

答案 0 :(得分:2)

您可以创建自己的扩展方法,并将它们转发到发布版本中的“真实”AsParallel方法,并在调试版本中使用顺序方法。通过检查当前命名空间中的方法来解析扩展方法,然后搜索“外部”命名空间(实例方法仍然是首选)。

   class NonParallelQuery 
    {
        IEnumerable _data;
        public NonParallelQuery(IEnumerable data)
        {
            _data = data;

        }
        public IEnumerator GetEnumerator()
        {
            return _data.GetEnumerator();
        }
    }

    static class Extensions
    {
        public static NonParallelQuery AsParallel(this IEnumerable source)
        {
#if DEBUG
            return new NonParallelQuery(ParallelEnumerable.AsParallel(source));
#else
            return new NonParallelQuery(source);
#endif
        }
    }


    public partial class Form1 : Form
    {

        public Form1()
        {
            var data = new string[] { "first", "second" };
            foreach (var str in data.Select(x => x.ToString()).AsParallel())
            {
                Debug.Print("Value {0}", str);
            }
            InitializeComponent();
        }

答案 1 :(得分:2)

怎么样?
            var result = 
                source
#if TURN_ON_LINQ_PARALLELISM
                .AsParallel()
#endif
                .Select(value => value.StartsWith("abcd"));