c# starter l05-linq
TRANSCRIPT
Mohammad Shakermohammadshaker.com
C# Programming Course@ZGTRShaker
2011, 2012, 2013, 2014
C# StarterL05 – LINQ and Lambda Expressions
LINQ
LINQOne of the most awesome things ever done!
LINQWhere’s Java?
LINQWhere’s Java?
2013 with some tool (not as good as .NET)
LINQstatic void Main(string[] args)
{string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe",
"Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};var queryResults = from n in names
where n.StartsWith("S")select n;
Console.WriteLine("Names beginning with S:");foreach (var item in queryResults) {
Console.WriteLine(item);}Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
LINQstatic void Main(string[] args)
{string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe",
"Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};var queryResults = from n in names
where n.StartsWith("S")select n;
Console.WriteLine("Names beginning with S:");foreach (var item in queryResults) {
Console.WriteLine(item);}Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
LINQstatic void Main(string[] args)
{string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe",
"Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};var queryResults = from n in names
where n.StartsWith("S")select n;
Console.WriteLine("Names beginning with S:");foreach (var item in queryResults) {
Console.WriteLine(item);}Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
List<string> queryResults = new List<string>();foreach (var item in names){
if (n.StartsWith(“S”)){
queryResults.Add(item);}
}
var queryResults = from n in nameswhere n.StartsWith("S")select n;
LINQstatic void Main(string[] args)
{string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe",
"Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};var queryResults = from n in names
where n.StartsWith("S")select n;
Console.WriteLine("Names beginning with S:");foreach (var item in queryResults) {
Console.WriteLine(item);}Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
List<string> queryResults = new List<string>();foreach (var item in names){
if (n.StartsWith(“S”)){
queryResults.Add(item);}
}
var queryResults = from n in nameswhere n.StartsWith("S")select n;
LINQstatic void Main(string[] args)
{string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe",
"Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};var queryResults = from n in names
where n.StartsWith("S")select n;
Console.WriteLine("Names beginning with S:");foreach (var item in queryResults) {
Console.WriteLine(item);}Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
List<string> queryResults = new List<string>();foreach (var item in names){
if (n.StartsWith(“S”)){
queryResults.Add(item);}
}
var queryResults = from n in nameswhere n.StartsWith("S")select n;
The SAME!
LINQstatic void Main(string[] args)
{string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe",
"Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};var queryResults = from n in names
where n.StartsWith("S")select n;
Console.WriteLine("Names beginning with S:");foreach (var item in queryResults) {
Console.WriteLine(item);}Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
List<string> queryResults = new List<string>();foreach (var item in names){
if (n.StartsWith(“S”)){
queryResults.Add(item);}
}
var queryResults = from n in nameswhere n.StartsWith("S")select n;
The SAME!
LINQstatic void Main(string[] args)
{string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe",
"Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};var queryResults = from n in names
where n.StartsWith("S")select n;
Console.WriteLine("Names beginning with S:");foreach (var item in queryResults) {
Console.WriteLine(item);}Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
LINQstatic void Main(string[] args)
{string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe",
"Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};var queryResults = from n in names
where n.StartsWith("S")select n;
Console.WriteLine("Names beginning with S:");foreach (var item in queryResults) {
Console.WriteLine(item);}Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
Names beginning with S:SmithSmytheSmallSinghSambaProgram finished, press Enter/Return to continue:
LINQstatic void Main(string[] args)
{string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe",
"Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};var queryResults = from n in names
select n;Console.WriteLine("Names beginning with S:");foreach (var item in queryResults) {
Console.WriteLine(item);}Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
LINQstatic void Main(string[] args)
{string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe",
"Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};var queryResults = from n in names
select n;Console.WriteLine("Names beginning with S:");foreach (var item in queryResults) {
Console.WriteLine(item);}Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
Names beginning with S:AlonsoZhengSmithJonesSmytheSmallRuizHsiehJorgensonIlyichSinghSambaProgram finished, press Enter/Return to continue:
LINQstatic void Main(string[] args)
{string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe",
"Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};var queryResults = from n in names
select n;Console.WriteLine("Names beginning with S:");foreach (var item in queryResults) {
Console.WriteLine(item);}Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
Names beginning with S:AlonsoZhengSmithJonesSmytheSmallRuizHsiehJorgensonIlyichSinghSambaProgram finished, press Enter/Return to continue:
Lambda Expressions
Tons of code in a line
Lambda Expressions
• The operator => is called the lambda operator.
n => n < 1000
“ Lambda ” comes from the lambda calculus, the mathematical formalism underlying
functional programming languages, which are the kind of programming on which LINQ is
based. If you are interested, check out sources such as the Wikipedia article on lambda
calculus. You don ’ t need to understand the mathematics to use lambda functions, although
understanding functional programming is helpful for advanced LINQ programming.
Lambda Expressions
var queryResults = from n in nameswhere n.StartsWith("S")select n;
Lambda Expressions
n => n.StartsWith(“S”)
var queryResults = from n in nameswhere n.StartsWith("S")select n;
Lambda Expressions
n => n.StartsWith(“S”)
var queryResults = from n in nameswhere n.StartsWith("S")select n;
Lambda Expressions
static void Main(string[] args){
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe","Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};
var queryResults = names.Where(n => n.StartsWith("S"));Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults) {
Console.WriteLine(item);}
Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
Lambda Expressions
static void Main(string[] args){
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe","Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};
var queryResults = names.Where(n => n.StartsWith("S"));Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults) {
Console.WriteLine(item);}
Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
Lambda Expressions
static void Main(string[] args){
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe","Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};
var queryResults = names.Where(n => n.StartsWith("S"));Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults) {
Console.WriteLine(item);}
Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
Names beginning with S:SmithSmytheSmallSinghSambaProgram finished, press Enter/Return to continue:
Query Techniques
Ordering Query Results
static void Main(string[] args){
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe","Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};
var queryResults = from n in nameswhere n.StartsWith("S")orderby nselect n;
Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults) {
Console.WriteLine(item);}
Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
Ordering Query Results
static void Main(string[] args){
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe","Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};
var queryResults = from n in nameswhere n.StartsWith("S")orderby nselect n;
Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults) {
Console.WriteLine(item);}
Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
Names beginning with S:SambaSinghSmallSmithSmytheProgram finished, press Enter/Return to continue:
Ordering Query Results
• Descending order
• This orders the example results as follows:
orderby n descending
SmytheSmithSmallSinghSamba
Ordering Query Results
• Ordering Using Method Syntax
var queryResults = names.OrderBy(n => n).Where(n => n.StartsWith(“S”));
static void Main(string[] args){
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe","Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};
var queryResults = names.OrderBy(n => n).Where(n => n.StartsWith("S"));
Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults) {
Console.WriteLine(item);}
Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
Ordering Query Results
• Ordering Using Method Syntax
var queryResults = names.OrderBy(n => n).Where(n => n.StartsWith(“S”));
static void Main(string[] args){
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe","Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};
var queryResults = names.OrderBy(n => n).Where(n => n.StartsWith("S"));
Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults) {
Console.WriteLine(item);}
Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
Names beginning with S:SambaSinghSmallSmithSmytheProgram finished, press Enter/Return to continue:
Ordering Query Results
• Ordering Using Method Syntax
var queryResults = names.OrderBy(n => n).Where(n => n.StartsWith(“S”));
static void Main(string[] args){
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe","Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba"};
var queryResults = names.OrderBy(n => n).Where(n => n.StartsWith("S"));
Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults) {
Console.WriteLine(item);}
Console.Write("Program finished, press Enter/Return to continue:");Console.ReadLine();
}
Names beginning with S:SambaSinghSmallSmithSmytheProgram finished, press Enter/Return to continue:
IOrderedEnumerable < string > and IEnumerable < string >
Ordering Query Results
• Descending order
var queryResults = names.OrderByDescending(n => n).Where(n => n.StartsWith(“S”));
Ordering Query Results
• What does this do?
var queryResults =names.OrderBy(n => n.Substring(n.Length-1)).Where(n => n.StartsWith(“S”));
Ordering Query Results
• What does this do?
var queryResults =names.OrderBy(n => n.Substring(n.Length-1)).Where(n => n.StartsWith(“S”));
Ordering Query Results
• What does this do?
var queryResults =names.OrderBy(n => n.Substring(n.Length-1)).Where(n => n.StartsWith(“S”));
Querying Complex Objects
Querying Complex Objectsclass Customer{
public string ID { get; set; }public string City { get; set; }public string Country { get; set; }public string Region { get; set; }public decimal Sales { get; set; }
}
Querying Complex Objectsstatic void Main(string[] args){
List < Customer > customers = new List < Customer > {
new Customer { ID=”A”, City=”New York”, Country=”USA”,Region=”North America”, Sales=9999},new Customer { ID=”B”, City=”Mumbai”, Country=”India”,Region=”Asia”, Sales=8888 },new Customer { ID=”C”, City=”Karachi”, Country=”Pakistan”,Region=”Asia”, Sales=7777 },new Customer { ID=”D”, City=”Delhi”, Country=”India”,Region=”Asia”, Sales=6666 },new Customer { ID=”E”, City=”S ã o Paulo”, Country=”Brazil”,Region=”South America”, Sales=5555 },new Customer { ID=”F”, City=”Moscow”, Country=”Russia”,Region=”Europe”, Sales=4444 },…
};
var queryResults =from c in customerswhere c.Region == “Asia”select c;
Console.WriteLine(“Customers in Asia:”);foreach (Customer c in queryResults){
Console.WriteLine(c);}
Console.Write(“Program finished, press Enter/Return to continue:”);Console.ReadLine();
}
Querying Complex Objects
• The output:
• Why?!
– Because ToString() is called for each Customer object. ToString() Is inherited directly
from the object class.
• Solution: Override the ToString() method.
Customers in Asia:CSharpCourse2011.CustomerCSharpCourse2011.CustomerCSharpCourse2011.CustomerCSharpCourse2011.CustomerCSharpCourse2011.CustomerCSharpCourse2011.CustomerCSharpCourse2011.CustomerCSharpCourse2011.CustomerCSharpCourse2011.CustomerCSharpCourse2011.CustomerProgram finished, press Enter/Return to continue:
Querying Complex Objects
• From this:
• To this:class Customer{
public string ID { get; set; }public string City { get; set; }public string Country { get; set; }public string Region { get; set; }public decimal Sales { get; set; }
public override string ToString(){
return “ID: “ + ID + “ City: “ + City + “ Country: “ + Country +“ Region: “ + Region + “ Sales: “ + Sales;
}}
class Customer{
public string ID { get; set; }public string City { get; set; }public string Country { get; set; }public string Region { get; set; }public decimal Sales { get; set; }
}
Querying Complex Objects
• The output now is:
Customers in Asia:ID: B City: Mumbai Country: India Region: Asia Sales: 8888ID: C City: Karachi Country: Pakistan Region: Asia Sales: 7777ID: D City: Delhi Country: India Region: Asia Sales: 6666ID: G City: Seoul Country: Korea Region: Asia Sales: 3333ID: H City: Istanbul Country: Turkey Region: Asia Sales: 2222ID: I City: Shanghai Country: China Region: Asia Sales: 1111ID: L City: Jakarta Country: Indonesia Region: Asia Sales: 3000ID: M City: Tokyo Country: Japan Region: Asia Sales: 4000ID: P City: Tehran Country: Iran Region: Asia Sales: 7000ID: R City: Beijing Country: China Region: Asia Sales: 9000Program finished, press Enter/Return to continue:
Querying Complex Objects
var queryResults =from c in customerswhere c.Region == “Asia”select c.City;
MumbaiKarachiDelhiSeoulIstanbulShanghaiJakartaTokyoTehranBeijing
Selecting Multiple Properties
Querying Complex Objects
• Let’s see this:
select c.City, c.Country, c.Sales
Querying Complex Objects
• Let’s see this:
• It’s an error. Unlike in SQL, LINQ does not allow multiple fields in a select clause!
– So, what’s the solution?
• Just creating a new object on-the-fly in the select clause to hold the results you want for your query!
select c.City, c.Country, c.Sales
Querying Complex Objects
• Let’s see this:
• It’s an error. Unlike in SQL, LINQ does not allow multiple fields in a select clause!
– So, what’s the solution?
• Just creating a new object on-the-fly in the select clause to hold the results you want for your query!
select c.City, c.Country, c.Sales
var queryResults =from c in customerswhere c.Region == “North America”select new { c.City, c.Country, c.Sales };
foreach (var item in queryResults){
Console.WriteLine(item);}
Querying Complex Objects
• Let’s see this:
• It’s an error. Unlike in SQL, LINQ does not allow multiple fields in a select clause!
– So, what’s the solution?
• Just creating a new object on-the-fly in the select clause to hold the results you want for your query!
select c.City, c.Country, c.Sales
var queryResults =from c in customerswhere c.Region == “North America”select new { c.City, c.Country, c.Sales };
foreach (var item in queryResults){
Console.WriteLine(item);}
{ City = New York, Country = USA, Sales = 9999 }{ City = Mexico City, Country = Mexico, Sales = 2000 }{ City = Los Angeles, Country = USA, Sales = 5000 }Program finished, press Enter/Return to continue:
Querying Complex Objects
• Now, instead of all this:
• Let’s try this:
var queryResults = customers.Where(c => c.Region == “North America”).Select(c => new { c.City, c.Country, c.Sales });
var queryResults =from c in customerswhere c.Region == “North America”select new { c.City, c.Country, c.Sales };
foreach (var item in queryResults){
Console.WriteLine(item);}
Querying Complex Objects
• Now, instead of all this:
• Let’s try this:
var queryResults = customers.Where(c => c.Region == “North America”).Select(c => new { c.City, c.Country, c.Sales });
{ City = New York, Country = USA, Sales = 9999 }{ City = Mexico City, Country = Mexico, Sales = 2000 }{ City = Los Angeles, Country = USA, Sales = 5000 }Program finished, press Enter/Return to continue:
var queryResults =from c in customerswhere c.Region == “North America”select new { c.City, c.Country, c.Sales };
foreach (var item in queryResults){
Console.WriteLine(item);}
Querying Complex Objects
• Now, instead of this:
• Let’s try this:
var queryResults = customers.Select(c => new { c.City, c.Country, c.Sales }).Where(c => c.Region == “North America”);
var queryResults = customers.Where(c => c.Region == “North America”).Select(c => new { c.City, c.Country, c.Sales });
Querying Complex Objects
• Now, instead of this:
• Let’s try this:
• It’s a Compiler Error! Because: The Region property is not included in the
anonymous type.
{c.City, c.Country, c.Sales } created by the Select() projection. The
compiler doesn’t know it yet!
var queryResults = customers.Select(c => new { c.City, c.Country, c.Sales }).Where(c => c.Region == “North America”);
var queryResults = customers.Where(c => c.Region == “North America”).Select(c => new { c.City, c.Country, c.Sales });
Querying Complex Objects
• OK, now, instead of this:
• Let’s try this:
var queryResults = customers.Select(c => new { c.City, c.Country, c.Sales }).Where(c => c.City == “New York”);
var queryResults = customers.Where(c => c.Region == “North America”).Select(c => new { c.City, c.Country, c.Sales });
Querying Complex Objects
• OK, now, instead of this:
• Let’s try this:
• Works beautifully!
var queryResults = customers.Select(c => new { c.City, c.Country, c.Sales }).Where(c => c.City == “New York”);
var queryResults = customers.Where(c => c.Region == “North America”).Select(c => new { c.City, c.Country, c.Sales });
Querying Complex Objects
• Distinct
var queryResults = customers.Select(c => c.Region).Distinct();
var queryResults = (from c in customers select c.Region).Distinct();
Ordering By Multiple Levels
Ordering By Multiple Levels
var queryResults =from c in customersorderby c.Region, c.Country, c.Cityselect new { c.ID, c.Region, c.Country, c.City };
Ordering By Multiple Levels
var queryResults =from c in customersorderby c.Region, c.Country, c.Cityselect new { c.ID, c.Region, c.Country, c.City };
{ ID = O, Region = Africa, Country = Egypt, City = Cairo }{ ID = J, Region = Africa, Country = Nigeria, City = Lagos }{ ID = R, Region = Asia, Country = China, City = Beijing }{ ID = I, Region = Asia, Country = China, City = Shanghai }{ ID = D, Region = Asia, Country = India, City = Delhi }{ ID = B, Region = Asia, Country = India, City = Mumbai }{ ID = L, Region = Asia, Country = Indonesia, City = Jakarta }{ ID = P, Region = Asia, Country = Iran, City = Tehran }{ ID = M, Region = Asia, Country = Japan, City = Tokyo }{ ID = G, Region = Asia, Country = Korea, City = Seoul }….
Drilling further
• Many other techniques
• Grouping
• Joining
• Take
• Skip
• ….