If you are experience .NET developer then you might aware
about LINQ and it’s advantage, Yes it’s a uniform query language to get and
filter data from various data source.
Fine, but link is beyond than that when we combine various
functions and operators associated with LINQ query. You believe or not, by
using those functions we can make LINQ more robust data processing and
manipulation query.
In this article we will see various functions and operators
associated with LINQ and we will see how it makes simple of data processing
operation.
We can categorize the operators in many categories. Let’s
see few of them.
Aggregation:
Here we will understand various LINQ operators which will
work on data , let’s start with aggregation . Here is few examples.
namespace ConsoleApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //Example of aggregration
            int[] data = { 1, 2, 3, 4,
5 };
            //Sum of numbers
            Console.WriteLine(data.Sum());   //ans:15
            //Average of numbers
            Console.WriteLine(data.Average());
//Ans :3 
            //Max of numbers
            Console.WriteLine(data.Max());  //Ans :5
            String[] strdata = {"1","two","three","four","five"};
            //Item with minimum length
            Console.WriteLine(strdata.Min());  //Ans :1
            //Item with minimum character(same as above)
            Console.WriteLine(strdata.Min(f=>f.Length));  //Ans:1
            //Items with maximum character
            Console.WriteLine(strdata.Max(f
=> f.Length)); //Ans :5
            Console.ReadLine();
        }
    }
}
Concatination:
Concatenation operation takes place when we want to combine
more than one element. In this example we have used Concat function to combine
two arrays. I believe, many developer don’t know the shortcut to combine two
arrays, sometimes they use foreach or some kind of iterative statement to do
same job. 
using System;
using System.Collections.Generic;
using System.Linq;
    public class Program
    {
        public static void Main(string[] args)
        {
            //First array
            int[] data = { 1, 2, 3 };
            //Concatination with another array
            int[] result = data.Concat(new int[] { 4, 5, 6 }).ToArray();
            //result 1,2,3,4,5,6
        }
    }
Conversion:
The dictionary meaning of conversion is applicable here.  To convert one type to another type, we can
use Cast parameterized function. In this example I am showing to convert from
IEnumerable to list and array.
       public static void Main(string[] args)
        {
            object[] data = { "1", "2", "3", "4", "5" };
            //Cast to Ienumerable<string>
            IEnumerable<string> strEnum
= data.Cast<string>();
            //Cast to List
            List<string> strList
= data.Cast<string>().ToList();
            //Cast to Array
            string[] strArray = data.Cast<string>().ToArray();
        }
Element operation:
It’s very common in application that, sometime we need some
direct element, direct in the sense we want to pick the element by it’s index
or by query. There are many functions available , with which we can combine
lambda expression to make our job simple.
public static void Main(string[] args)
        {
            int[] data = { 1, 2, 3, 4,
5 };
            data.ElementAt(10);   //Error
 data.ElementAtOrDefault(10);  //null
            data.First();  //1
            string[] name = {"sourav","Ram","Shyam"};
            //First three letter name
            name.First(m => m.Length ==
3); // Ram
            //First name which is greater then 3
            name.First(m => m.Length >
3); //sourav
            //Last element of array
            name.Last();  //Shyam
            //Get one element
            name.Single(); //Exception.
More than one element
            //Try to get single element if empty array then return
null
            name.SingleOrDefault(); 
//Exception: More than one element
            //try to get item whose length is 10 
            name.SingleOrDefault(m => m.Length
== 10);  //null
        }
Equality:
Equality checking between
list or some kind of collection is another common requirement in application.
If we want to check whether the words are sequentially arrange or not ?we can
use SequenceEqual function. Though ,many are there. Just I have mention the
uncommon one. 
public static void Main(string[] args)
        {
            //Equality checking.
            string[] words = { "sourav", "Ram", "Shyam" };
            //Check whether all items are present sequencially or not 
            words.SequenceEqual(new[] { "sourav", "Ram", "Shyam" });  //Ans : True
            //Case is different
            words.SequenceEqual(new[] { "SOURAV", "RAM", "SHYAM" }); //False
            //Ignore cases in checking
            words.SequenceEqual(new[] { "SOURAV", "RAM", "SHYAM"}, StringComparer.OrdinalIgnoreCase); //True
        }
Partitioning:
This operation divides the whole set into two partitions and
picks one of them. In this example we will see few functions combining with
lambda expression.
public static void Main(string[] args)
        {
            string[] name = { "one","two", "three" };
            // take two elements from list 
  name.Take(2).ToList<string>();  // one
two 
            //Skip first one element in list 
            name.Skip(1).ToList<string>(); //two three
            //Take eleents whose length is 3
            name.TakeWhile(f => f.Length ==
3);  //one two 
            //Skil element when length is less than 4
            name.SkipWhile(f => f.Length <
4); // three
            Console.ReadLine();
        }
Projection:
This operation needed when we want to take certain part from
collection. Here , we are taking part of name array by length, by its index position.
Have a look on below example.
public static void Main(string[] args)
        {
            string[] name = { "one","two", "three" };
            //Find lenght if all element.
            name.Select(f => f.Length);  // 3 3 4
            //print element with index 
            name.Select((a, b) => b.ToString()
+ ":" + a);  // 0 :
one 1: two 2:three
            //Print items nuber of times by it's index
            //For example one is in 0th position - so not printed
            //two is in 1st position - so printed one time
            //Three is in 2nd position - so printed 2 times
            name.SelectMany((a, b) => Enumerable.Repeat(a,
b)).ToArray(); //two
three three
            Console.ReadLine();
        }
Set based operation:
Set based operation is not
very common in day to day programming life, but it’s useful to know overview of
the functions. It’s very similar to normal math set operation. Just have a
quick look on below example.
public static void Main(string[] args)
        {
            //set based operation 
            string[] first = { "a", "b", "b" ,"c" };
            string[] second = { "c", "d", "e" };
            //Select unique element 
            first.Distinct(); 
// a,b,c
            //Intersect -Take common
            first.Intersect(second);  // c
            //Union - Get all unique element
            first.Union(second);      //a b c
d e
            //Except 
            first.Except(second);     // a b
            Console.ReadLine();
        }
Filtering:
Filtering is very much essential in day to day programming
activity. In this example we will see few useful filtering functions associated
with lambda expression.
public static void Main(string[] args)
        {
            //Sorting
            string[] name = {"one","two","three" };
            //Order collection alphabetically- First character
            name.OrderBy(f => f).ToArray();  //one
three two
            //arrange alphabetically on second character
            name.OrderBy(f => f[1]);
// three one two
            //Order by length
            name.OrderBy(f => f.Length);  //one
two three
            //Order by length descending
            name.OrderByDescending(f => f.Length);
            //First by length then Descending.
            name.OrderBy(f => f.Length).ThenByDescending(f
=> f); //two one three
            Console.ReadLine();
        }
Conclusion:-
In this article we have see various functions associated with LINQ
and lambda expression. It’s good to know if those functions, to reduce the code
amount and program complexity.


