SlideShare a Scribd company logo
Mohammad Shaker
mohammadshaker.com
C# Programming Course
@ZGTRShaker
2011, 2012, 2013, 2014
C# Starter
L05 – LINQ and Lambda Expressions
LINQ
LINQ
One of the most awesome things ever done!
LINQ
Where’s Java?
LINQ
Where’s Java?
2013 with some tool (not as good as .NET)
LINQ
static 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();
}
LINQ
static 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();
}
LINQ
static 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 names
where n.StartsWith("S")
select n;
LINQ
static 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 names
where n.StartsWith("S")
select n;
LINQ
static 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 names
where n.StartsWith("S")
select n;
The SAME!
LINQ
static 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 names
where n.StartsWith("S")
select n;
The SAME!
LINQ
static 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();
}
LINQ
static 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:
Smith
Smythe
Small
Singh
Samba
Program finished, press Enter/Return to continue:
LINQ
static 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();
}
LINQ
static 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:
Alonso
Zheng
Smith
Jones
Smythe
Small
Ruiz
Hsieh
Jorgenson
Ilyich
Singh
Samba
Program finished, press Enter/Return to continue:
LINQ
static 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:
Alonso
Zheng
Smith
Jones
Smythe
Small
Ruiz
Hsieh
Jorgenson
Ilyich
Singh
Samba
Program 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 names
where n.StartsWith("S")
select n;
Lambda Expressions
n => n.StartsWith(“S”)
var queryResults = from n in names
where n.StartsWith("S")
select n;
Lambda Expressions
n => n.StartsWith(“S”)
var queryResults = from n in names
where 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:
Smith
Smythe
Small
Singh
Samba
Program 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 names
where n.StartsWith("S")
orderby n
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();
}
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 names
where n.StartsWith("S")
orderby n
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:
Samba
Singh
Small
Smith
Smythe
Program finished, press Enter/Return to continue:
Ordering Query Results
• Descending order
• This orders the example results as follows:
orderby n descending
Smythe
Smith
Small
Singh
Samba
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:
Samba
Singh
Small
Smith
Smythe
Program 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:
Samba
Singh
Small
Smith
Smythe
Program 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 Objects
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
static 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 customers
where 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.Customer
CSharpCourse2011.Customer
CSharpCourse2011.Customer
CSharpCourse2011.Customer
CSharpCourse2011.Customer
CSharpCourse2011.Customer
CSharpCourse2011.Customer
CSharpCourse2011.Customer
CSharpCourse2011.Customer
CSharpCourse2011.Customer
Program 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: 8888
ID: C City: Karachi Country: Pakistan Region: Asia Sales: 7777
ID: D City: Delhi Country: India Region: Asia Sales: 6666
ID: G City: Seoul Country: Korea Region: Asia Sales: 3333
ID: H City: Istanbul Country: Turkey Region: Asia Sales: 2222
ID: I City: Shanghai Country: China Region: Asia Sales: 1111
ID: L City: Jakarta Country: Indonesia Region: Asia Sales: 3000
ID: M City: Tokyo Country: Japan Region: Asia Sales: 4000
ID: P City: Tehran Country: Iran Region: Asia Sales: 7000
ID: R City: Beijing Country: China Region: Asia Sales: 9000
Program finished, press Enter/Return to continue:
Querying Complex Objects
var queryResults =
from c in customers
where c.Region == “Asia”
select c.City;
Mumbai
Karachi
Delhi
Seoul
Istanbul
Shanghai
Jakarta
Tokyo
Tehran
Beijing
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 customers
where 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 customers
where 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 customers
where 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 customers
where 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 customers
orderby c.Region, c.Country, c.City
select new { c.ID, c.Region, c.Country, c.City };
Ordering By Multiple Levels
var queryResults =
from c in customers
orderby c.Region, c.Country, c.City
select 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
• ….

More Related Content

PDF
The Ring programming language version 1.9 book - Part 31 of 210
PDF
The Ring programming language version 1.4 book - Part 6 of 30
PDF
The Ring programming language version 1.8 book - Part 29 of 202
PPTX
Delegates and events
PDF
12 events and delegates
PDF
12 Rules You Should to Know as a Syrian Graduate
PDF
Ultra Fast, Cross Genre, Procedural Content Generation in Games [Master Thesis]
The Ring programming language version 1.9 book - Part 31 of 210
The Ring programming language version 1.4 book - Part 6 of 30
The Ring programming language version 1.8 book - Part 29 of 202
Delegates and events
12 events and delegates
12 Rules You Should to Know as a Syrian Graduate
Ultra Fast, Cross Genre, Procedural Content Generation in Games [Master Thesis]

More from Mohammad Shaker (20)

PDF
Interaction Design L06 - Tricks with Psychology
PDF
Short, Matters, Love - Passioneers Event 2015
PDF
Unity L01 - Game Development
PDF
Android L07 - Touch, Screen and Wearables
PDF
Interaction Design L03 - Color
PDF
Interaction Design L05 - Typography
PDF
Interaction Design L04 - Materialise and Coupling
PDF
Android L05 - Storage
PDF
Android L04 - Notifications and Threading
PDF
Android L09 - Windows Phone and iOS
PDF
Interaction Design L01 - Mobile Constraints
PDF
Interaction Design L02 - Pragnanz and Grids
PDF
Android L10 - Stores and Gaming
PDF
Android L06 - Cloud / Parse
PDF
Android L08 - Google Maps and Utilities
PDF
Android L03 - Styles and Themes
PDF
Android L02 - Activities and Adapters
PDF
Android L01 - Warm Up
PDF
Indie Series 03: Becoming an Indie
PDF
Indie Series 01: Intro to Games
Interaction Design L06 - Tricks with Psychology
Short, Matters, Love - Passioneers Event 2015
Unity L01 - Game Development
Android L07 - Touch, Screen and Wearables
Interaction Design L03 - Color
Interaction Design L05 - Typography
Interaction Design L04 - Materialise and Coupling
Android L05 - Storage
Android L04 - Notifications and Threading
Android L09 - Windows Phone and iOS
Interaction Design L01 - Mobile Constraints
Interaction Design L02 - Pragnanz and Grids
Android L10 - Stores and Gaming
Android L06 - Cloud / Parse
Android L08 - Google Maps and Utilities
Android L03 - Styles and Themes
Android L02 - Activities and Adapters
Android L01 - Warm Up
Indie Series 03: Becoming an Indie
Indie Series 01: Intro to Games
Ad

Recently uploaded (20)

PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Microsoft Solutions Partner Drive Digital Transformation with D365.pdf
PPTX
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx
PDF
TrustArc Webinar - Click, Consent, Trust: Winning the Privacy Game
PPT
What is a Computer? Input Devices /output devices
PPTX
Tartificialntelligence_presentation.pptx
PDF
1 - Historical Antecedents, Social Consideration.pdf
PDF
DASA ADMISSION 2024_FirstRound_FirstRank_LastRank.pdf
PDF
Developing a website for English-speaking practice to English as a foreign la...
PDF
STKI Israel Market Study 2025 version august
PDF
2021 HotChips TSMC Packaging Technologies for Chiplets and 3D_0819 publish_pu...
PDF
Architecture types and enterprise applications.pdf
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PPT
Module 1.ppt Iot fundamentals and Architecture
PDF
Univ-Connecticut-ChatGPT-Presentaion.pdf
PPTX
The various Industrial Revolutions .pptx
PDF
DP Operators-handbook-extract for the Mautical Institute
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PPTX
cloud_computing_Infrastucture_as_cloud_p
PDF
WOOl fibre morphology and structure.pdf for textiles
NewMind AI Weekly Chronicles - August'25-Week II
Microsoft Solutions Partner Drive Digital Transformation with D365.pdf
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx
TrustArc Webinar - Click, Consent, Trust: Winning the Privacy Game
What is a Computer? Input Devices /output devices
Tartificialntelligence_presentation.pptx
1 - Historical Antecedents, Social Consideration.pdf
DASA ADMISSION 2024_FirstRound_FirstRank_LastRank.pdf
Developing a website for English-speaking practice to English as a foreign la...
STKI Israel Market Study 2025 version august
2021 HotChips TSMC Packaging Technologies for Chiplets and 3D_0819 publish_pu...
Architecture types and enterprise applications.pdf
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Module 1.ppt Iot fundamentals and Architecture
Univ-Connecticut-ChatGPT-Presentaion.pdf
The various Industrial Revolutions .pptx
DP Operators-handbook-extract for the Mautical Institute
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
cloud_computing_Infrastucture_as_cloud_p
WOOl fibre morphology and structure.pdf for textiles
Ad

C# Starter L05-LINQ

  • 1. Mohammad Shaker mohammadshaker.com C# Programming Course @ZGTRShaker 2011, 2012, 2013, 2014 C# Starter L05 – LINQ and Lambda Expressions
  • 3. LINQ One of the most awesome things ever done!
  • 5. LINQ Where’s Java? 2013 with some tool (not as good as .NET)
  • 6. LINQ static 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(); }
  • 7. LINQ static 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(); }
  • 8. LINQ static 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 names where n.StartsWith("S") select n;
  • 9. LINQ static 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 names where n.StartsWith("S") select n;
  • 10. LINQ static 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 names where n.StartsWith("S") select n; The SAME!
  • 11. LINQ static 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 names where n.StartsWith("S") select n; The SAME!
  • 12. LINQ static 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(); }
  • 13. LINQ static 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: Smith Smythe Small Singh Samba Program finished, press Enter/Return to continue:
  • 14. LINQ static 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(); }
  • 15. LINQ static 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: Alonso Zheng Smith Jones Smythe Small Ruiz Hsieh Jorgenson Ilyich Singh Samba Program finished, press Enter/Return to continue:
  • 16. LINQ static 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: Alonso Zheng Smith Jones Smythe Small Ruiz Hsieh Jorgenson Ilyich Singh Samba Program finished, press Enter/Return to continue:
  • 18. Tons of code in a line
  • 19. 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.
  • 20. Lambda Expressions var queryResults = from n in names where n.StartsWith("S") select n;
  • 21. Lambda Expressions n => n.StartsWith(“S”) var queryResults = from n in names where n.StartsWith("S") select n;
  • 22. Lambda Expressions n => n.StartsWith(“S”) var queryResults = from n in names where n.StartsWith("S") select n;
  • 23. 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(); }
  • 24. 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(); }
  • 25. 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: Smith Smythe Small Singh Samba Program finished, press Enter/Return to continue:
  • 27. 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 names where n.StartsWith("S") orderby n 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(); }
  • 28. 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 names where n.StartsWith("S") orderby n 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: Samba Singh Small Smith Smythe Program finished, press Enter/Return to continue:
  • 29. Ordering Query Results • Descending order • This orders the example results as follows: orderby n descending Smythe Smith Small Singh Samba
  • 30. 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(); }
  • 31. 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: Samba Singh Small Smith Smythe Program finished, press Enter/Return to continue:
  • 32. 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: Samba Singh Small Smith Smythe Program finished, press Enter/Return to continue: IOrderedEnumerable < string > and IEnumerable < string >
  • 33. Ordering Query Results • Descending order var queryResults = names.OrderByDescending(n => n).Where(n => n.StartsWith(“S”));
  • 34. Ordering Query Results • What does this do? var queryResults = names.OrderBy(n => n.Substring(n.Length-1)).Where(n => n.StartsWith(“S”));
  • 35. Ordering Query Results • What does this do? var queryResults = names.OrderBy(n => n.Substring(n.Length-1)).Where(n => n.StartsWith(“S”));
  • 36. Ordering Query Results • What does this do? var queryResults = names.OrderBy(n => n.Substring(n.Length-1)).Where(n => n.StartsWith(“S”));
  • 38. Querying Complex Objects 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; } }
  • 39. Querying Complex Objects static 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 customers where 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(); }
  • 40. 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.Customer CSharpCourse2011.Customer CSharpCourse2011.Customer CSharpCourse2011.Customer CSharpCourse2011.Customer CSharpCourse2011.Customer CSharpCourse2011.Customer CSharpCourse2011.Customer CSharpCourse2011.Customer CSharpCourse2011.Customer Program finished, press Enter/Return to continue:
  • 41. 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; } }
  • 42. Querying Complex Objects • The output now is: Customers in Asia: ID: B City: Mumbai Country: India Region: Asia Sales: 8888 ID: C City: Karachi Country: Pakistan Region: Asia Sales: 7777 ID: D City: Delhi Country: India Region: Asia Sales: 6666 ID: G City: Seoul Country: Korea Region: Asia Sales: 3333 ID: H City: Istanbul Country: Turkey Region: Asia Sales: 2222 ID: I City: Shanghai Country: China Region: Asia Sales: 1111 ID: L City: Jakarta Country: Indonesia Region: Asia Sales: 3000 ID: M City: Tokyo Country: Japan Region: Asia Sales: 4000 ID: P City: Tehran Country: Iran Region: Asia Sales: 7000 ID: R City: Beijing Country: China Region: Asia Sales: 9000 Program finished, press Enter/Return to continue:
  • 43. Querying Complex Objects var queryResults = from c in customers where c.Region == “Asia” select c.City; Mumbai Karachi Delhi Seoul Istanbul Shanghai Jakarta Tokyo Tehran Beijing
  • 45. Querying Complex Objects • Let’s see this: select c.City, c.Country, c.Sales
  • 46. 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
  • 47. 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 customers where c.Region == “North America” select new { c.City, c.Country, c.Sales }; foreach (var item in queryResults) { Console.WriteLine(item); }
  • 48. 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 customers where 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:
  • 49. 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 customers where c.Region == “North America” select new { c.City, c.Country, c.Sales }; foreach (var item in queryResults) { Console.WriteLine(item); }
  • 50. 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 customers where c.Region == “North America” select new { c.City, c.Country, c.Sales }; foreach (var item in queryResults) { Console.WriteLine(item); }
  • 51. 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 });
  • 52. 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 });
  • 53. 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 });
  • 54. 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 });
  • 55. Querying Complex Objects • Distinct var queryResults = customers.Select(c => c.Region).Distinct(); var queryResults = (from c in customers select c.Region).Distinct();
  • 57. Ordering By Multiple Levels var queryResults = from c in customers orderby c.Region, c.Country, c.City select new { c.ID, c.Region, c.Country, c.City };
  • 58. Ordering By Multiple Levels var queryResults = from c in customers orderby c.Region, c.Country, c.City select 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 } ….
  • 59. Drilling further • Many other techniques • Grouping • Joining • Take • Skip • ….