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 - Sample 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 - Sample 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 - Sample 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 - Sample 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 - Sample 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 - Sample
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 - Sample
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 - Sample
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 - Sample
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 - Sample 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 - Sample 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 - Sample 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 - Sample 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 - Sample
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 - Sample
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 - Sample 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 - Sample 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 - Sample
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 - Sample
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 - Sample
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 - Sample
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 - Sample
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 - Sample
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 - Sample
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 - Sample
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
}
}