using System;
using System.Collections.Generic;
using System.Linq;
namespace CSharpSamples
{
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public double Salary { get; set; }
public DateTime DateOfJoining { get; set; }
}
public class Department
{
public int ID { get; set; }
public string Name { get; set; }
}
public class CaseInsensitiveComparer : IComparer<string>
{
public int Compare(string x, string y)
{
return string.Compare(x, y, StringComparison.OrdinalIgnoreCase);
}
}
public class LINQSamples
{
public List<Employee> EmployeeList { get; set; }
public List<Department> DepartmentList { get; set; }
public LINQSamples()
{
this.EmployeeList = GetEmployeeList();
this.DepartmentList = GetDepartmentList();
}
public List<Employee> GetEmployeeList()
{
List<Employee> employeeList = new List<Employee>()
{
new Employee()
{
ID = 1,
Name = "Anil",
Department = "Information Technology",
Salary = 20000,
DateOfJoining = new DateTime(2006, 09, 11)
},
new Employee()
{
ID = 2,
Name = "Prasad",
Department = "Information Technology",
Salary = 25000,
DateOfJoining = new DateTime(2005, 12, 1)
},
new Employee()
{
ID = 3,
Name = "Mohan",
Department = "Information Technology",
Salary = 50000,
DateOfJoining = new DateTime(2003, 5, 18)
},
new Employee()
{
ID = 4,
Name = "Praveen",
Department = "Finance",
Salary = 22000,
DateOfJoining = new DateTime(2010, 2, 10)
},
new Employee()
{
ID = 5,
Name = "Ravi",
Department = "Finance",
Salary = 40000,
DateOfJoining = new DateTime(2007, 6, 16)
},
new Employee()
{
ID = 6,
Name = "Krishna",
Department = "Human Resources",
Salary = 80000,
DateOfJoining = new DateTime(2003, 5, 18)
},
new Employee()
{
ID = 7,
Name = "Avinash",
Department = "Human Resources",
Salary = 32000,
DateOfJoining = new DateTime(2011, 3, 24)
},
new Employee()
{
ID = 8,
Name = "Pankaj",
Department = "Admin",
Salary = 28000,
DateOfJoining = new DateTime(2009, 4, 9)
},
new Employee()
{
ID = 9,
Name = "Narendra",
Department = "Admin",
Salary = 18000,
DateOfJoining = new DateTime(2008, 11, 19)
},
new Employee()
{
ID = 10,
Name = "Kumar",
Department = "Admin",
Salary = 10000,
DateOfJoining = new DateTime(2011, 09, 8)
}
};
return employeeList;
}
public List<Department> GetDepartmentList()
{
List<Department> departmentList = new List<Department>()
{
new Department()
{
ID = 1,
Name = "Admin"
},
new Department()
{
ID = 2,
Name = "Finance"
},
new Department()
{
ID = 3,
Name = "Human Resources"
},
new Department()
{
ID = 4,
Name = "Information Technology"
},
new Department()
{
ID = 5,
Name = "Sales"
}
};
return departmentList;
}
public string FormatEmployeeInformation(Employee emp)
{
return string.Format("ID: {0} Name: {1} Department: {2} Salary: {3} DOJ: {4}",
emp.ID, emp.Name, emp.Department, emp.Salary, emp.DateOfJoining.ToString("dd-MMM-yyyy"));
}
#region Restriction Operators
// Where - Simple 1
public void Linq1()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var lowNums = from n in numbers
where n < 6
select n;
Console.WriteLine();
Console.WriteLine("Numers List: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
Console.WriteLine("Numbers < 6:");
foreach (var x in lowNums)
{
Console.WriteLine(x);
}
Console.WriteLine();
}
// Where - Simple 2
public void Linq2()
{
var empWithSal10K = from e in EmployeeList
where e.Salary == 10000
select e;
Console.WriteLine();
Console.WriteLine("Employees having Salary equals to 10000:");
Console.WriteLine();
foreach (var emp in empWithSal10K)
{
Console.WriteLine(FormatEmployeeInformation(emp));
}
Console.WriteLine();
}
// Where - Simple 3
public void Linq3()
{
var employeesJoinedAfter2009WithMoreThan15K = from e in EmployeeList
where e.DateOfJoining > new DateTime(2009, 12, 31)
&& e.Salary > 15000
select e;
Console.WriteLine();
Console.WriteLine("Employees joined after 2009 and having salary more than 15000:");
Console.WriteLine();
foreach (var emp in employeesJoinedAfter2009WithMoreThan15K)
{
Console.WriteLine(FormatEmployeeInformation(emp));
}
Console.WriteLine();
}
// Where - Indexed
public void Linq4()
{
string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
var shortDigits = digits.Where((digit, index) => digit.Length < index);
Console.WriteLine();
Console.WriteLine("Digits List: { \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\" }");
Console.WriteLine();
Console.WriteLine("Short digits:");
foreach (var d in shortDigits)
{
Console.WriteLine("The word {0} is shorter than its value.", d);
}
Console.WriteLine();
}
#endregion
#region Projection Operators
// Select - Simple 1
public void Linq5()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var numsPlusOne = from n in numbers
select n + 1;
Console.WriteLine();
Console.WriteLine("Numbers { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine("Numbers + 1:");
foreach (var i in numsPlusOne)
{
Console.WriteLine(i);
}
Console.WriteLine();
}
// Select - Simple 2
public void Linq6()
{
var employeeNames = from e in EmployeeList
select e.Name;
Console.WriteLine();
Console.WriteLine("List of Employees:");
Console.WriteLine();
foreach (var empName in employeeNames)
{
Console.WriteLine(empName);
}
Console.WriteLine();
}
// Select - Transformation
public void Linq7()
{
int[] numbers = { 4, 5, 1, 3, 9, 8, 6, 7, 2, 0 };
string[] strings = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
var textNums = from n in numbers
select strings[n];
Console.WriteLine();
Console.WriteLine("Numbers List: { 4, 5, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine("Strings List: { \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\" }");
Console.WriteLine();
Console.WriteLine("Number strings:");
foreach (var s in textNums)
{
Console.WriteLine(s);
}
Console.WriteLine();
}
// Select - Anonymous Types 1
public void Linq8()
{
string[] words = { "MicroSOFT", "GooGle", "aDOBE", "aPPle" };
var upperLowerWords = from w in words
select new
{
Upper = w.ToUpper(),
Lower = w.ToLower()
};
Console.WriteLine();
Console.WriteLine("Input Words: { \"MicroSOFT\", \"GooGle\", \"aDOBE\", \"aPPle\" }");
Console.WriteLine();
foreach (var ul in upperLowerWords)
{
Console.WriteLine("UPPERCASE: {0}\t lowercase: {1}", ul.Upper, ul.Lower);
}
Console.WriteLine();
}
// Select - Anonymous Types 2
public void Linq9()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
string[] strings = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
var digitOddEvens = from n in numbers
select new
{
Digit = strings[n],
Even = (n % 2 == 0)
};
Console.WriteLine();
Console.WriteLine("Even/Odd Check:");
Console.WriteLine();
foreach (var d in digitOddEvens)
{
Console.WriteLine("The digit {0} is {1}.", d.Digit, d.Even ? "even" : "odd");
}
Console.WriteLine();
}
// Select - Anonymous Types 3
public void Linq10()
{
var employeesInfo = from e in EmployeeList
select new
{
e.Name,
e.Department,
Salary = e.Salary
};
Console.WriteLine();
Console.WriteLine("Employees Info:");
Console.WriteLine();
foreach (var empInfo in employeesInfo)
{
Console.WriteLine("<{0}> is in the Department <{1}> and having salary <{2}>.", empInfo.Name, empInfo.Department, empInfo.Salary);
}
Console.WriteLine();
}
// Select - Indexed
public void Linq11()
{
int[] numbers = { 4, 5, 1, 3, 9, 8, 6, 7, 2, 0 };
var numsInPlace = numbers.Select((num, index) => new { Num = num, InPlace = (num == index) });
Console.WriteLine();
Console.WriteLine("Numbers List: { 4, 5, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
Console.WriteLine("Number: In-Place?");
Console.WriteLine();
foreach (var n in numsInPlace)
{
Console.WriteLine("{0}: {1}", n.Num, n.InPlace);
}
Console.WriteLine();
}
// Select - Filtered
public void Linq12()
{
var employeesInfo = from e in EmployeeList
where e.Salary > 20000
select e;
Console.WriteLine();
Console.WriteLine("Employees having Salary > 20000:");
Console.WriteLine();
foreach (var emp in employeesInfo)
{
Console.WriteLine(FormatEmployeeInformation(emp));
}
Console.WriteLine();
}
// SelectMany - Compound from 1
public void Linq13()
{
int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };
int[] numbersB = { 1, 3, 5, 7, 8 };
var pairs = from a in numbersA
from b in numbersB
where a < b
select new { a, b };
Console.WriteLine();
Console.WriteLine("Set A: { 0, 2, 4, 5, 6, 8, 9 }");
Console.WriteLine("Set B: { 1, 3, 5, 7, 8 }");
Console.WriteLine();
Console.WriteLine("Pairs where a < b:");
Console.WriteLine();
foreach (var pair in pairs)
{
Console.WriteLine("{0} is less than {1}", pair.a, pair.b);
}
Console.WriteLine();
}
// SelectMany - Compound from 2
public void Linq14()
{
int[] salaries = { 10000, 15000, 20000, 25000 };
var empSalaries = from e in EmployeeList
from s in salaries
where e.Salary > s
select new
{
e.Name,
e.Salary,
s
};
Console.WriteLine();
Console.WriteLine("Salary Comparision with the Set: { 10000, 15000, 20000, 25000 }");
Console.WriteLine();
foreach (var item in empSalaries)
{
Console.WriteLine(item.Name + " Salary(" + item.Salary + ") is more than " + item.s.ToString());
}
Console.WriteLine();
}
// SelectMany - Multiple from
public void Linq15()
{
int[] salaries = { 10000, 15000, 20000, 25000 };
var empSalaries = from e in EmployeeList
where e.Name.ToUpper().StartsWith("P")
from s in salaries
where e.Salary > s
select new
{
e.Name,
e.Salary,
s
};
Console.WriteLine();
Console.WriteLine("Salary Comparision of Employees whose names start with \"P\" with the Set: { 10000, 15000, 20000, 25000 }");
Console.WriteLine();
foreach (var item in empSalaries)
{
Console.WriteLine(item.Name + " Salary(" + item.Salary + ") is more than " + item.s.ToString());
}
Console.WriteLine();
}
#endregion
#region Partitioning Operators
// Take - Simple
public void Linq16()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var first4Numbers = numbers.Take(4);
Console.WriteLine();
Console.WriteLine("Numbers List: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
Console.WriteLine("First 4 Numbers:");
Console.WriteLine();
foreach (var n in first4Numbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
// TakeWhile - Simple
public void Linq17()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var firstNumbersLessThan7 = numbers.TakeWhile(n => n < 7);
Console.WriteLine();
Console.WriteLine("Numbers List: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
Console.WriteLine("First Numbers less than 7:");
foreach (var n in firstNumbersLessThan7)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
// TakeWhile - Indexed
public void Linq18()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var firstSmallNumbers = numbers.TakeWhile((n, index) => n >= index);
Console.WriteLine();
Console.WriteLine("Numbers List: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
Console.WriteLine("First numbers not less than their position:");
Console.WriteLine();
foreach (var n in firstSmallNumbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
// Skip - Simple
public void Linq19()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var allButFirst3Numbers = numbers.Skip(3);
Console.WriteLine();
Console.WriteLine("Numbers List: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
Console.WriteLine("All but first 3 numbers:");
Console.WriteLine();
foreach (var n in allButFirst3Numbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
// SkipWhile - Simple
public void Linq20()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var allButFirst3Numbers = numbers.SkipWhile(n => n % 3 != 0);
Console.WriteLine();
Console.WriteLine("Numbers List: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
Console.WriteLine("All elements starting from first element divisible by 3:");
Console.WriteLine();
foreach (var n in allButFirst3Numbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
// SkipWhile - Indexed
public void Linq21()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var laterNumbers = numbers.SkipWhile((n, index) => n >= index);
Console.WriteLine();
Console.WriteLine("Numbers List: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
Console.WriteLine("All elements starting from first element greater than than its position:");
Console.WriteLine();
foreach (var n in laterNumbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
#endregion
#region Ordering Operators
// OrderBy - Simple 1
public void Linq22()
{
string[] words = { "Microsoft", "Google", "Adobe", "Apple", "IBM" };
var sortedWords = from w in words
orderby w
select w;
Console.WriteLine();
Console.WriteLine("Input Words: { \"Microsoft\", \"Google\", \"Adobe\", \"Apple\", \"IBM\" }");
Console.WriteLine();
Console.WriteLine("The sorted list of words:");
Console.WriteLine();
foreach (var w in sortedWords)
{
Console.WriteLine(w);
}
Console.WriteLine();
}
// OrderBy - Simple 2
public void Linq23()
{
var sortedEmployees = from e in EmployeeList
orderby e.Name
select e;
Console.WriteLine();
Console.WriteLine("Employees List in Name Ascending Order:");
Console.WriteLine();
foreach (var emp in sortedEmployees)
{
Console.WriteLine(FormatEmployeeInformation(emp));
}
Console.WriteLine();
}
// OrderBy - Comparer
public void Linq24()
{
string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" };
var sortedWords = words.OrderBy(a => a, new CaseInsensitiveComparer());
Console.WriteLine();
Console.WriteLine("Input Words: { \"aPPLE\", \"AbAcUs\", \"bRaNcH\", \"BlUeBeRrY\", \"ClOvEr\", \"cHeRry\" }");
Console.WriteLine();
Console.WriteLine("The sorted(A-Z) list of words:");
Console.WriteLine();
foreach (var w in sortedWords)
{
Console.WriteLine(w);
}
Console.WriteLine();
}
// OrderByDescending - Simple 1
public void Linq25()
{
double[] doubles = { 3.2, 1.3, 5.9, 7.1, 4.7 };
var sortedDoubles = from d in doubles
orderby d descending
select d;
Console.WriteLine();
Console.WriteLine("Input Decimals: { 3.2, 1.3, 5.9, 7.1, 4.7 }");
Console.WriteLine();
Console.WriteLine("The doubles from highest to lowest:");
Console.WriteLine();
foreach (var d in sortedDoubles)
{
Console.WriteLine(d);
}
Console.WriteLine();
}
// OrderByDescending - Simple 2
public void Linq26()
{
var sortedEmployees = from e in EmployeeList
orderby e.Salary descending
select e;
Console.WriteLine();
Console.WriteLine("Employees List from Highest to Lowest Salary:");
Console.WriteLine();
foreach (var emp in sortedEmployees)
{
Console.WriteLine(FormatEmployeeInformation(emp));
}
Console.WriteLine();
}
// OrderByDescending - Comparer
public void Linq27()
{
string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" };
var sortedWords = words.OrderByDescending(a => a, new CaseInsensitiveComparer());
Console.WriteLine();
Console.WriteLine("Input Words: { \"aPPLE\", \"AbAcUs\", \"bRaNcH\", \"BlUeBeRrY\", \"ClOvEr\", \"cHeRry\" }");
Console.WriteLine();
Console.WriteLine("The sorted(Z-A) list of words:");
Console.WriteLine();
foreach (var w in sortedWords)
{
Console.WriteLine(w);
}
Console.WriteLine();
}
// ThenBy - Simple
public void Linq28()
{
string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
var sortedDigits = digits.OrderBy(d => d.Length).ThenBy(d => d);
Console.WriteLine();
Console.WriteLine("Input Words: { \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\" }");
Console.WriteLine();
Console.WriteLine("Sorted Words first by length and then by Alphabetical order:");
Console.WriteLine();
foreach (var d in sortedDigits)
{
Console.WriteLine(d);
}
Console.WriteLine();
}
// ThenBy - Comparer
public void Linq29()
{
string[] words = { "apple", "abacus", "branch", "blueberry", "clover", "cherry" };
var sortedWords = words.OrderBy(a => a.Length)
.ThenBy(a => a, new CaseInsensitiveComparer());
Console.WriteLine();
Console.WriteLine("Input Words: { \"apple\", \"abacus\", \"branch\", \"blueberry\", \"clover\", \"cherry\" }");
Console.WriteLine();
Console.WriteLine("The sorted list of words first by length and next by alphabetical order(A-Z):");
Console.WriteLine();
foreach (var w in sortedWords)
{
Console.WriteLine(w);
}
Console.WriteLine();
}
// ThenByDescending - Simple
public void Linq30()
{
var sortedEmployees = from e in EmployeeList
orderby e.Department, e.Salary descending
select e;
Console.WriteLine();
Console.WriteLine("Employees List in Department Ascending Order and Salary Descending Order:");
Console.WriteLine();
foreach (var emp in sortedEmployees)
{
Console.WriteLine(FormatEmployeeInformation(emp));
}
Console.WriteLine();
}
// ThenByDescending - Comparer
public void Linq31()
{
string[] words = { "apple", "abacus", "branch", "blueberry", "clover", "cherry" };
var sortedWords = words.OrderBy(a => a.Length)
.ThenByDescending(a => a, new CaseInsensitiveComparer());
Console.WriteLine();
Console.WriteLine("Input Words: { \"apple\", \"abacus\", \"branch\", \"blueberry\", \"clover\", \"cherry\" }");
Console.WriteLine();
Console.WriteLine("The sorted list of words first by length ascending and next by alphabetical order descending(Z-A):");
Console.WriteLine();
foreach (var w in sortedWords)
{
Console.WriteLine(w);
}
Console.WriteLine();
}
// Reverse
public void Linq32()
{
string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
var reversedIDigits = (from d in digits
where d[1] == 'i'
select d).Reverse();
Console.WriteLine();
Console.WriteLine("Input Words: { \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\" }");
Console.WriteLine();
Console.WriteLine("A backwards list of the digits with a second character of 'i':");
Console.WriteLine();
foreach (var d in reversedIDigits)
{
Console.WriteLine(d);
}
Console.WriteLine();
}
#endregion
#region Grouping Operators
// GroupBy - Simple 1
public void Linq33()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var numberGroups = from n in numbers
group n by n % 4 into g
select new
{
Remainder = g.Key,
Numbers = g
};
Console.WriteLine();
Console.WriteLine("Input Numbers: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
foreach (var g in numberGroups)
{
Console.WriteLine("Numbers with a remainder of {0} when divided by 5:", g.Remainder);
foreach (var n in g.Numbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
Console.WriteLine();
string[] words = { "blueberry", "chimpanzee", "abacus", "banana", "apple", "cheese" };
var wordGroups = from w in words
group w by w[0] into g
select new
{
FirstLetter = g.Key,
Words = g
};
Console.WriteLine("Input Words: { \"blueberry\", \"chimpanzee\", \"abacus\", \"banana\", \"apple\", \"cheese\" }");
Console.WriteLine();
foreach (var g in wordGroups)
{
Console.WriteLine("Words that start with the letter '{0}':", g.FirstLetter);
foreach (var w in g.Words)
{
Console.WriteLine(w);
}
Console.WriteLine();
}
Console.WriteLine();
}
// GroupBy - Simple 2
public void Linq34()
{
var deptEmployees = from e in EmployeeList
group e by e.Department into Employees
select new
{
Department = Employees.Key,
Employees
};
Console.WriteLine();
Console.WriteLine("Departmentwise Employees List:");
Console.WriteLine();
foreach (var dept in deptEmployees)
{
Console.WriteLine("Department: " + dept.Department);
foreach (var emp in dept.Employees)
{
Console.WriteLine(FormatEmployeeInformation(emp));
}
Console.WriteLine();
}
Console.WriteLine();
}
// GroupBy - Nested
public void Linq35()
{
var deptEmployees = from e in EmployeeList
group e by e.Department into DEPTGRPS
orderby DEPTGRPS.Key
select new
{
Dept = DEPTGRPS.Key,
DeptGroups = from e1 in DEPTGRPS
group e1 by e1.DateOfJoining.Year into YearGroups
orderby YearGroups.Key
select new
{
year = YearGroups.Key,
emps = YearGroups
}
};
Console.WriteLine();
Console.WriteLine("Department wise and joining year wise Employees List:");
Console.WriteLine();
foreach (var dept in deptEmployees)
{
Console.WriteLine("Department: " + dept.Dept);
foreach (var emp in dept.DeptGroups)
{
Console.WriteLine("Joining Year: " + emp.year.ToString());
foreach (var item in emp.emps)
{
Console.WriteLine(FormatEmployeeInformation(item));
}
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine();
}
Console.WriteLine();
}
#endregion
#region Set operators
// Distinct - 1
public void Linq36()
{
int[] factorsOf300 = { 2, 2, 3, 5, 5 };
var uniqueFactors = factorsOf300.Distinct();
Console.WriteLine();
Console.WriteLine("Prime factors of 300: { 2, 2, 3, 5, 5 }");
Console.WriteLine();
Console.WriteLine("Unique Prime factors of 300:");
Console.WriteLine();
foreach (var f in uniqueFactors)
{
Console.WriteLine(f);
}
Console.WriteLine();
}
// Distinct - 2
public void Linq37()
{
var departments = (from e in EmployeeList
select e.Department).Distinct();
Console.WriteLine();
Console.WriteLine("List of All Departments:");
Console.WriteLine();
foreach (var dept in departments)
{
Console.WriteLine(dept);
}
Console.WriteLine();
}
// Union - 1
public void Linq38()
{
int[] numbersA = { 0, 2, 4, 6, 8 };
int[] numbersB = { 0, 3, 6, 9 };
var uniqueNumbers = numbersA.Union(numbersB);
Console.WriteLine();
Console.WriteLine("Input Arrays: { 0, 2, 4, 6, 8 }, { 0, 3, 6, 9 }");
Console.WriteLine();
Console.WriteLine("Unique Numbers from both the arrays:");
Console.WriteLine();
foreach (var n in uniqueNumbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
// Union - 2
public void Linq39()
{
var empFirstChars = from e in EmployeeList
select e.Name[0];
var deptFirstChars = from e in EmployeeList
select e.Department[0];
var uniqueFirstChars = empFirstChars.Union(deptFirstChars);
Console.WriteLine();
Console.WriteLine("Unique first letters from Employee Names and Department Names:");
Console.WriteLine();
foreach (var ch in uniqueFirstChars)
{
Console.WriteLine(ch);
}
Console.WriteLine();
}
// Intersect - 1
public void Linq40()
{
int[] numbersA = { 0, 2, 4, 6, 8 };
int[] numbersB = { 0, 3, 6, 9 };
var commonNumbers = numbersA.Intersect(numbersB);
Console.WriteLine();
Console.WriteLine("Input Arrays: { 0, 2, 4, 6, 8 }, { 0, 3, 6, 9 }");
Console.WriteLine();
Console.WriteLine("Common Numbers from both the arrays:");
Console.WriteLine();
foreach (var n in commonNumbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
// Intersect - 2
public void Linq41()
{
var empFirstChars = from e in EmployeeList
select e.Name[0];
var deptFirstChars = from e in EmployeeList
select e.Department[0];
var commonFirstChars = empFirstChars.Intersect(deptFirstChars);
Console.WriteLine();
Console.WriteLine("Common first letters from Employee Names and Department Names:");
Console.WriteLine();
foreach (var ch in commonFirstChars)
{
Console.WriteLine(ch);
}
Console.WriteLine();
}
// Except - 1
public void Linq42()
{
int[] numbersA = { 0, 2, 4, 6, 8 };
int[] numbersB = { 0, 3, 6, 9 };
var uniqueNumbers = numbersA.Except(numbersB);
Console.WriteLine();
Console.WriteLine("Input Arrays: { 0, 2, 4, 6, 8 }, { 0, 3, 6, 9 }");
Console.WriteLine();
Console.WriteLine("Numbers in first array but not in second array:");
Console.WriteLine();
foreach (var n in uniqueNumbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
// Except - 2
public void Linq43()
{
var empFirstChars = from e in EmployeeList
select e.Name[0];
var deptFirstChars = from e in EmployeeList
select e.Department[0];
var commonFirstChars = empFirstChars.Except(deptFirstChars);
Console.WriteLine();
Console.WriteLine("First letters from Employee Names, but not from Department Names:");
Console.WriteLine();
foreach (var ch in commonFirstChars)
{
Console.WriteLine(ch);
}
Console.WriteLine();
}
#endregion
#region Conversion Operators
// ToArray
public void Linq44()
{
double[] doubles = { 1.5, 2.3, 1.8, 4.2, 3.6, 5.4 };
var sortedDoubles = from d in doubles
orderby d descending
select d;
var doublesArray = sortedDoubles.ToArray();
Console.WriteLine();
Console.WriteLine("Array of Doubles: { 1.5, 2.3, 1.8, 4.2, 3.6, 5.4 }");
Console.WriteLine();
Console.WriteLine("Doubles from highest to lowest:");
Console.WriteLine();
for (int d = 0; d < doublesArray.Length; d++)
{
Console.WriteLine(doublesArray[d]);
}
Console.WriteLine();
}
// ToList
public void Linq45()
{
var employees = from e in EmployeeList
orderby e.Department
select e.Name;
var empList = employees.ToList();
Console.WriteLine();
Console.WriteLine("The Sorted Employee List:");
Console.WriteLine();
foreach (var e in empList)
{
Console.WriteLine(e);
}
Console.WriteLine();
}
// ToDictionary
public void Linq46()
{
var salaryRecords = new[]
{
new { Name = "Anil", Salary = 20000 },
new { Name = "Prasad" , Salary = 25000 },
new { Name = "Mohan", Salary = 50000 }
};
var salaryRecordsDict = salaryRecords.ToDictionary(sr => sr.Name);
Console.WriteLine();
Console.WriteLine("Salary Records: \n\n{ Name = \"Anil\", Salary = 20000 }\n{ Name = \"Prasad\" , Salary = 25000 }\n{ Name = \"Mohan\", Salary = 50000 }");
Console.WriteLine();
Console.WriteLine("Salary Records Dictionary Items:");
Console.WriteLine();
foreach (var rec in salaryRecordsDict)
{
Console.WriteLine(rec);
}
Console.WriteLine();
}
// OfType
public void Linq47()
{
object[] numbers = { null, 1.0, "two", 3, "four", 5, "six", 7.0, 8, "nine" };
var strings = numbers.OfType<string>();
Console.WriteLine();
Console.WriteLine("Object Array: { null, 1.0, \"two\", 3, \"four\", 5, \"six\", 7.0, 8, \"nine\" }");
Console.WriteLine();
Console.WriteLine("Numbers stored as strings:");
Console.WriteLine();
foreach (var s in strings)
{
Console.WriteLine(s);
}
Console.WriteLine();
}
#endregion
#region Element Operators
// First - Simple
public void Linq48()
{
Employee emp = (from e in EmployeeList
select e).First();
Console.WriteLine();
Console.WriteLine("First Employee Record:");
Console.WriteLine();
Console.WriteLine(FormatEmployeeInformation(emp));
Console.WriteLine();
}
// First - Condition
public void Linq49()
{
Employee emp2011 = EmployeeList.First(e => e.DateOfJoining.Year == 2011);
Console.WriteLine();
Console.WriteLine("First Employee Record having Joining Year 2011:");
Console.WriteLine();
Console.WriteLine(FormatEmployeeInformation(emp2011));
Console.WriteLine();
}
// FirstOrDefault - Simple
public void Linq50()
{
int[] numbers = { };
int firstNumOrDefault = numbers.FirstOrDefault();
Console.WriteLine();
Console.WriteLine("Input Array: { }");
Console.WriteLine();
Console.WriteLine("First Record Or Default Record if First Not Available:");
Console.WriteLine();
Console.WriteLine(firstNumOrDefault);
Console.WriteLine();
}
// FirstOrDefault - Condition
public void Linq51()
{
var emp2002 = EmployeeList.FirstOrDefault(emp => emp.DateOfJoining.Year == 2002);
Console.WriteLine();
Console.WriteLine("First Record Or Default Record if First Not Available:");
Console.WriteLine();
Console.WriteLine("Any Employee Joined in the Year 2002: {0}", emp2002 != null);
Console.WriteLine();
}
// ElementAt
public void Linq52()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int fourthLowNum = (from n in numbers
where n > 5
select n).ElementAt(1);
// second number is index 1 because sequences use 0-based indexing
Console.WriteLine();
Console.WriteLine("Input Array: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
Console.WriteLine("Second Number > 5: {0}", fourthLowNum);
Console.WriteLine();
}
#endregion
#region Generation Operators
// Range
public void Linq53()
{
var numbers = from n in Enumerable.Range(1, 10)
select new
{
Number = n,
OddEven = n % 2 == 1 ? "Odd" : "Even"
};
Console.WriteLine();
Console.WriteLine("Numbers from 1 to 10, identify Odd/Even");
Console.WriteLine();
foreach (var n in numbers)
{
Console.WriteLine("The Number {0} is {1}.", n.Number, n.OddEven);
}
Console.WriteLine();
}
// Repeat
public void Linq54()
{
var employees = Enumerable.Repeat<Employee>(EmployeeList.Last(), 5);
Console.WriteLine();
Console.WriteLine("Print Last Employee Record 5 times");
Console.WriteLine();
foreach (var e in employees)
{
Console.WriteLine(FormatEmployeeInformation(e));
}
Console.WriteLine();
}
#endregion
#region Quantifiers
// Any - Simple
public void Linq55()
{
bool nAfterA = EmployeeList.Any(emp => emp.Name.Contains("an"));
Console.WriteLine();
Console.WriteLine("There are employees whose name contains 'an': {0}", nAfterA);
Console.WriteLine();
}
// Any - Grouped
public void Linq56()
{
var deptGroups = from e in EmployeeList
group e by e.Department into g
where g.Any(e => e.DateOfJoining.Year == 2011)
select new
{
Dept = g.Key,
Employees = g
};
Console.WriteLine();
Console.WriteLine("List out the Departments which is having any of the employees under that department joined in 2011.");
Console.WriteLine();
foreach (var grp in deptGroups)
{
Console.WriteLine(grp.Dept);
}
Console.WriteLine();
}
// All - Simple
public void Linq57()
{
bool allSalLessThanOneLakh = EmployeeList.All(emp => emp.Salary < 100000);
Console.WriteLine();
Console.WriteLine("All the employees salaries are lesser than 100000: {0}", allSalLessThanOneLakh);
Console.WriteLine();
}
// All - Grouped
public void Linq58()
{
var deptGroups = from e in EmployeeList
group e by e.Department into g
where g.All(e => e.DateOfJoining.Year < 2009)
select new
{
Dept = g.Key,
Employees = g
};
Console.WriteLine();
Console.WriteLine("List out the Departments which is having all the employees under that department joined before 2009.");
Console.WriteLine();
foreach (var grp in deptGroups)
{
Console.WriteLine(grp.Dept);
}
Console.WriteLine();
}
#endregion
#region Aggregate Operators
// Count - Simple
public void Linq59()
{
int noOfEmployees = EmployeeList.Count();
Console.WriteLine();
Console.WriteLine("No of Employees: {0}", noOfEmployees.ToString());
Console.WriteLine();
}
// Count - Conditional
public void Linq60()
{
int noOfEmployeesSalMoreThan50000 = EmployeeList.Count(emp => emp.Salary > 50000);
Console.WriteLine();
Console.WriteLine("No of Employees having Salary more than 50000: {0}", noOfEmployeesSalMoreThan50000.ToString());
Console.WriteLine();
}
// Count - Grouped
public void Linq61()
{
var deptEmpCounts = from e in EmployeeList
group e by e.Department into g
select new
{
Department = g.Key,
EmpCount = g.Count()
};
Console.WriteLine();
Console.WriteLine("List of Departments with Employee Count in each Department:");
Console.WriteLine();
foreach (var dept in deptEmpCounts)
{
Console.WriteLine(dept.Department + ": " + dept.EmpCount.ToString());
}
Console.WriteLine();
}
// Sum - Simple
public void Linq62()
{
int sumOfNumbers1To50 = Enumerable.Range(1, 50).Sum();
Console.WriteLine();
Console.WriteLine("Sum of Numbers from 1 to 50: {0}", sumOfNumbers1To50);
Console.WriteLine();
}
// Sum - Projection
public void Linq63()
{
int sumOfOddNumbers1To50 = Enumerable.Range(1, 50).Sum(n => (n % 2 == 1) ? n : 0);
int sumOfEvenNumbers1To50 = Enumerable.Range(1, 50).Sum(n => (n % 2 == 0) ? n : 0);
Console.WriteLine();
Console.WriteLine("Sum of Odd Numbers from 1 to 50: {0}", sumOfOddNumbers1To50);
Console.WriteLine();
Console.WriteLine("Sum of Even Numbers from 1 to 50: {0}", sumOfEvenNumbers1To50);
Console.WriteLine();
}
// Sum - Grouped
public void Linq64()
{
var deptEmpSal = from e in EmployeeList
group e by e.Department into g
select new
{
Department = g.Key,
SumEmpSal = g.Sum(e => e.Salary)
};
Console.WriteLine();
Console.WriteLine("List of Departments with Sum of Employee Salaries:");
Console.WriteLine();
foreach (var dept in deptEmpSal)
{
Console.WriteLine(dept.Department + ": " + dept.SumEmpSal.ToString());
}
Console.WriteLine();
}
// Min/Max/Average - Simple
public void Linq65()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int minNum = numbers.Min();
int maxNum = numbers.Max();
double avg = numbers.Average();
Console.WriteLine();
Console.WriteLine("Input Array: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
Console.WriteLine("The minimum number is {0}.", minNum);
Console.WriteLine("The maximum number is {0}.", maxNum);
Console.WriteLine("The Average is {0}.", avg);
Console.WriteLine();
}
// Min/Max/Average - Projection
public void Linq66()
{
double minSalary = EmployeeList.Min(emp => emp.Salary);
double maxSalary = EmployeeList.Max(emp => emp.Salary);
double avgSalary = EmployeeList.Average(emp => emp.Salary);
Console.WriteLine();
Console.WriteLine("Lowest Salary is: {0}", minSalary);
Console.WriteLine("Highest Salary is: {0}", maxSalary);
Console.WriteLine("Average Salary is: {0}", avgSalary);
Console.WriteLine();
}
// Min/Max/Average - Grouped
public void Linq67()
{
var deptEmpSals = from e in EmployeeList
group e by e.Department into g
select new
{
Department = g.Key,
MinSalary = g.Min(e => e.Salary),
MaxSalary = g.Max(e => e.Salary),
AvgSalary = g.Average(e => e.Salary)
};
Console.WriteLine();
Console.WriteLine("List of Departments with Lowest/Highest/Average Salaries:");
Console.WriteLine();
foreach (var dept in deptEmpSals)
{
Console.WriteLine(dept.Department + "\nMin Salary: " + dept.MinSalary.ToString() + "\nMax Salary: " + dept.MaxSalary.ToString() + "\nAvg Salary: " + dept.AvgSalary.ToString());
Console.WriteLine();
}
Console.WriteLine();
}
// Min/Max - Elements
public void Linq68()
{
var deptEmpSals = from e in EmployeeList
group e by e.Department into g
let maxSal = g.Max(e => e.Salary)
let minSal = g.Min(e => e.Salary)
select new
{
Department = g.Key,
LowestPaid = g.Where(e => e.Salary == minSal),
HighestPaid = g.Where(e => e.Salary == maxSal)
};
Console.WriteLine();
Console.WriteLine("List of Departments with Lowest/Highest Paid Employees:");
Console.WriteLine();
foreach (var dept in deptEmpSals)
{
Console.WriteLine(dept.Department);
Console.WriteLine("Lowest Paid:");
foreach (var lowestPaid in dept.LowestPaid)
{
Console.WriteLine(FormatEmployeeInformation(lowestPaid));
}
Console.WriteLine("Highest Paid:");
foreach (var highestPaid in dept.HighestPaid)
{
Console.WriteLine(FormatEmployeeInformation(highestPaid));
}
Console.WriteLine();
}
Console.WriteLine();
}
// Aggregate - Simple
public void Linq69()
{
double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9, 3.5, 8.9 };
double product = doubles.Aggregate((runningProduct, nextFactor) => runningProduct * nextFactor);
Console.WriteLine();
Console.WriteLine("Input Doubles: { 1.7, 2.3, 1.9, 4.1, 2.9, 3.5, 8.9 }");
Console.WriteLine();
Console.WriteLine("Total Product of all numbers: {0}", product);
Console.WriteLine();
}
// Aggregate - Seed
public void Linq70()
{
double startBalance = 1000.0;
int[] attemptedWithdrawals = { 200, 100, 400, 500, 100, 700, 300 };
double endBalance = attemptedWithdrawals.Aggregate(startBalance, (balance, nextWithdrawal) =>
((nextWithdrawal <= balance) ? (balance - nextWithdrawal) : balance));
Console.WriteLine();
Console.WriteLine("Starting Balance: 1000.00");
Console.WriteLine();
Console.WriteLine("Attempted Withdrawals: { 200, 100, 400, 500, 100, 700, 300 }");
Console.WriteLine();
Console.WriteLine("Ending Balance: {0}", endBalance);
Console.WriteLine();
}
#endregion
#region Concat EqualAll Operators
// Concat - 1
public void Linq71()
{
int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };
int[] numbersB = { 1, 3, 5, 7, 8 };
var allNumbers = numbersA.Concat(numbersB);
Console.WriteLine();
Console.WriteLine("Array 1: { 0, 2, 4, 5, 6, 8, 9 }");
Console.WriteLine("Array 2: { 1, 3, 5, 7, 8 }");
Console.WriteLine();
Console.WriteLine("All numbers from both arrays:");
foreach (var n in allNumbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
// Concat - 2
public void Linq72()
{
var keyWords = EmployeeList.Select(e => e.Name).Concat(EmployeeList.Select(e => e.Department));
Console.WriteLine();
Console.WriteLine("All Employees and Department Names:");
Console.WriteLine();
foreach (var n in keyWords)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
// SequenceEqual
public void Linq73()
{
var wordsA = new string[] { "microsoft", "adobe", "google" };
var wordsB = new string[] { "microsoft", "adobe", "google" };
bool match = wordsA.SequenceEqual(wordsB);
Console.WriteLine();
Console.WriteLine("Sequence 1: { \"microsoft\", \"adobe\", \"google\" }");
Console.WriteLine("Sequence 2: { \"microsoft\", \"adobe\", \"google\" }");
Console.WriteLine();
Console.WriteLine("The sequences match: {0}", match);
Console.WriteLine();
}
#endregion
#region Joins
// Cross Join
public void Linq74()
{
var deptCrossEmps = from d in DepartmentList
join e in EmployeeList on 1 equals 1
select new
{
Dept = d.Name,
EmployeeName = e.Name
};
Console.WriteLine();
Console.WriteLine("Department Cross Join Employee");
Console.WriteLine();
foreach (var deptEmp in deptCrossEmps)
{
Console.WriteLine(deptEmp.Dept + ": " + deptEmp.EmployeeName);
}
Console.WriteLine();
}
// Group/Inner Join
public void Linq75()
{
var deptEmps = from d in DepartmentList
join e in EmployeeList on d.Name equals e.Department
select new
{
Dept = d.Name,
EmployeeName = e.Name
};
Console.WriteLine();
Console.WriteLine("Department Group/Inner Join Employee");
Console.WriteLine();
foreach (var dept in deptEmps)
{
Console.WriteLine(dept.Dept + ": " + dept.EmployeeName);
}
Console.WriteLine();
}
// Left Outer Join
public void Linq76()
{
var deptEmps = from d in DepartmentList
join e in EmployeeList on d.Name equals e.Department into de
from e in de.DefaultIfEmpty()
select new
{
Department = d.Name,
EmpName = e == null ? "(No Employees Present)" : e.Name
};
Console.WriteLine();
Console.WriteLine("Department Left Outer Join Employee");
Console.WriteLine();
foreach (var dept in deptEmps)
{
Console.WriteLine(dept.Department + ": " + dept.EmpName);
}
Console.WriteLine();
}
#endregion
#region Query Execution
// Deferred Execution
public void Linq77()
{
// Sequence operators form first-class queries that are not executed until you enumerate over them.
int[] numbers = new int[] { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int i = 0;
var q = from n in numbers
select ++i;
// Note, the local variable 'i' is not incremented
// until each element is evaluated (as a side-effect):
Console.WriteLine();
Console.WriteLine("Deferred Execution");
Console.WriteLine();
foreach (var v in q)
{
Console.WriteLine("v = {0}, i = {1}", v, i);
}
Console.WriteLine();
}
// Immediate Execution
public void Linq78()
{
// Methods like ToList() cause the query to be executed immediately, caching the results.
int[] numbers = new int[] { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int i = 0;
var q = (from n in numbers
select ++i).ToList();
// The local variable i has already been fully // incremented before we iterate the results:
Console.WriteLine();
Console.WriteLine("Immediate Execution");
Console.WriteLine();
foreach (var v in q)
{
Console.WriteLine("v = {0}, i = {1}", v, i);
}
Console.WriteLine();
}
// Query Reuse
public void Linq79()
{
// Deferred execution lets us define a query once
// and then reuse it later after data changes.
int[] numbers = new int[] { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var lowNumbers = from n in numbers
where n <= 3
select n;
Console.WriteLine();
Console.WriteLine("Numbers Array: { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }");
Console.WriteLine();
Console.WriteLine("First run numbers <= 3:");
Console.WriteLine();
foreach (int n in lowNumbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
for (int i = 0; i < 10; i++)
{
numbers[i] = -numbers[i];
}
// During this second run, the same query object,
// lowNumbers, will be iterating over the new state
// of numbers[], producing different results:
Console.WriteLine("Second run numbers <= 3:");
Console.WriteLine();
foreach (int n in lowNumbers)
{
Console.WriteLine(n);
}
Console.WriteLine();
}
#endregion
}
}