LINQ使用与并行

Posted jhcelue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LINQ使用与并行相关的知识,希望对你有一定的参考价值。

LINQ介绍
參考:https://msdn.microsoft.com/en-us/library/bb397906.aspx
LINQ查询主要运行操作包含:1)获取数据源;2)创建查询;3)运行查询。须要注意的是仅仅有在使用查询结果的时候才会去运行查询,或者在创建查询之后再加上tolist或者toarray之类的功能则能够马上运行。

        // The Three Parts of a LINQ Query: 
        //  1. Data source. 
        int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

        // 2. Query creation. 
        // numQuery is an IEnumerable<int> 
        var numQuery =
            from num in numbers
            where (num % 2) == 0
            select num;

        // 3. Query execution. 
        foreach (int num in numQuery)
        {
            Console.Write("{0,1} ", num);
        }

数据源能够来自于Array、List等或者直接从文件里读取的结果。

查询语句操作
參考:https://msdn.microsoft.com/en-us/library/bb397927.aspx
Filter: where cust.City==”London” && cust.Name == “Devon”
Order: orderby cust.Name ascending
Group: group cust by cust.City into custGroup where custGroup.Count() > 2
Join: join dist in distributors on cust.City equals dist.City

其它功能
我们在使用LINQ操作的时候,往往另一些额外的需求,比方去重啊。分组啊等等。

            // The Three Parts of a LINQ Query: 
            //  1. Data source. 
            int[] numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 4 };

            // 2. Query creation. 
            // numQuery is an IEnumerable<int> 
            var numQuery =
                from num in numbers
                where (num % 2) == 0
                select num;

            // 3. Query execution. 
            foreach (int num in numQuery.Distinct())
            {
                Console.WriteLine("{0,1} ", num);
            }
            foreach (var num in numQuery.GroupBy(key => key))
            {
                Console.WriteLine("{0}:{1} ", num.Key, num.Count());
            }
            foreach (int num in numQuery.GroupBy(key => key).Select(key => key.Key))
            {
                Console.WriteLine("{0,1} ", num);
            }

并行处理
LINQ比較强大的是还提供了可并行处理的查询。这使得我们能够借助它来完毕一些查询或者处理的并行操作。

        static void Main(string[] args)
        {
            // The Three Parts of a LINQ Query: 
            //  1. Data source. 
            int[] numbers = new int[100];
            for (var i = 0; i < 100; i++)
                numbers[i] = i;

            // 2. Query creation. 
            // numQuery is an IEnumerable<int> 
            var numQuery =
                from num in numbers
                where (num % 2) == 0
                select num;

            // 3. Query execution. 
            Split(numQuery.ToList(), 10)
                .AsParallel()
                .WithDegreeOfParallelism(3)
                .Select(process)
                .ToList();
            Console.ReadKey();
        }

        static Tuple<List<int>, int> process(Tuple<List<int>, int> input)
        {
            foreach (var num in input.Item1)
                Console.WriteLine("{0}-{1}", num, input.Item2);
            return input;
        }

        static IEnumerable<Tuple<List<int>, int>> Split(List<int> nums, int Count)
        {
            int index = 0;
            List<int> num = new List<int>();
            foreach(var nm in nums)
            {
                num.Add(nm);
                if (num.Count >= Count)
                {
                    yield return new Tuple<List<int>, int>(num, index++);
                    num = new List<int>();
                }
            }
            if(num.Count > 0)
            {
                yield return new Tuple<List<int>, int>(num, index++);
            }
        }

具体介绍能够參考:https://msdn.microsoft.com/en-us/library/dd997425(v=vs.110).aspx

以上是关于LINQ使用与并行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中并行化以下代码片段?

如何并行运行 LINQ 'let' 语句?

PLINQ 并行操作Linq

线程池与并行度

[工作积累] UE4 并行渲染的同步 - Sync between FParallelCommandListSet & FRHICommandListImmediate calls(代码片段

linq 和并行性 - SQL Server