skynyrd
8/28/2016 - 8:50 AM

Rarely used LINQ extension methods

Rarely used LINQ extension methods

// C#, LINQ

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace LINQ
{
    class LinqExtensionMethods
    {
        static void Main(string[] args)
        {
            AsParallel(); //Running the query as parallel. Slower for smaller collections.
            Distinct(); //Removes duplicate elements.
            Except(); //Except subtracts elements from a collection.
            GroupBy(); //GroupBy transforms a collection into groups. Each group has a key.
            Join(); //Joining matches every element in two collections based on some condition.
            Union(); //Unions removing duplicates.
            Zip(); //Combines two lists using a selector function
            OfType(); //Searches for elements by their types. 
            Intersect(); //Extracts the intersect.

            Console.Read();
        }

        private static void Intersect()
        {
            var list1 = new List<int> { 4, 3, 6 };
            var list2 = new List<int> { 5, 4, 2 };

            var enumerable = list1.Intersect(list2);
            enumerable.ToList().ForEach(Console.WriteLine);
        }

        private static void OfType()
        {
            var list = new List<object>()
            {
                new StringBuilder(),
                new object(),
                "example",
                3,
                42D,
                "string"
            };

            list.OfType<string>().ToList().ForEach(Console.WriteLine);
        }

        private static void Zip()
        {
            var list1 = new List<int> { 4, 3, 6 };
            var list2 = new List<int> { 5, 4, 2 };

            list1.Zip(list2, (l1, l2) => l1 + l2).ToList().ForEach(Console.WriteLine);
        }

        private static void Union()
        {
            var list1 = new List<int> { 4, 3, 6 };
            var list2 = new List<int> { 5, 4, 2 };

            list1.Union(list2).ToList().ForEach(Console.WriteLine);
        }

        private static void Join()
        {
            var list1 = new List<int> { 4, 3, 6 };
            var list2 = new List<int> { 5, 4, 2 };

            var result = from item1 in list1
                         join item2 in list2 on (item1 + 1) equals item2
                         select item1;

            var resultAlternative = list1.Join(list2, i1 => i1 - 2, i2 => i2 - 3, (i1, i2) => i2);

            result.ToList().ForEach(Console.WriteLine);
        }

        public static void GroupBy()
        {
            int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

            var result = array.GroupBy(a => a % 2 == 0);
            result.ToList().ForEach(group =>
            {
                Console.Write(group.Key);
                group.ToList().ForEach(Console.WriteLine);
            });
        }

        private static void Except()
        {
            int[] values1 = { 1, 2, 3, 4 };
            int[] values2 = { 1, 2, 5 };

            var result = values1.Except(values2);

            result.ToList().ForEach(Console.WriteLine);
        }

        private static void Distinct()
        {
            var list = new List<int> { 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 9, 9 };
            list.Distinct().ToList().ForEach(Console.WriteLine);
        }

        private static void AsParallel()
        {
            var list = Enumerable.Range(0, short.MaxValue).ToList();

            var s1 = Stopwatch.StartNew();
            for (int i = 0; i < 10000; i++)
            {
                var dummy = list.Sum();
            }
            s1.Stop();

            Console.WriteLine(s1.ElapsedMilliseconds);

            var s2 = Stopwatch.StartNew();
            for (int i = 0; i < 1000; i++)
            {
                var dummy = list.AsParallel().Sum();
            }
            s2.Stop();

            Console.WriteLine(s2.ElapsedMilliseconds);
        }
    }
}