|
Introduction to the LINQ |
|
The Language Integrated Query |
|
|
When using for or foreach loops on a list,
you get the value or a range of values inside of the loop. Once you exit the
loop, the operation ends and you cannot access the value(s) that was(were)
isolated. If you want to get the isolated value or a list of values again,
you would have to perform the operation (create the loop), again.
|
In some cases, you may want to prepare and get one
value, a few values, or a range of values for later use, or to use over and
over again. To do this, you would create a value or a list of values and
store that list in a variable, outside of any loop, then use the value or
the list of values when needed. As applied to the for or the
foreach loop, to perform this operation, you use a conditional statement
that would examine the list, look for the value(s), get that value or those
values that respond(s) to the condition. Any value(s) that respond(s) to the
condition is(are) then stored in the new list. This technique of examining a
list is referred to as querying.
Practical
Learning: Introducing LINQ
|
|
- Start Microsoft Visual Studio and create a Console Application named
AltairRealtors1
- To create a new class, in the Class View, right-click
AltairRealtors1 -> Add -> Class...
- Change the name to Property and press Enter
- Complete the class as follows:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AltairRealtors1
{
public enum PropertyType
{
Condominium,
Townhouse,
SingleFamily,
Unknown
}
public enum PropertyCondition
{
Unknown,
Excellent,
Good,
NeedsRepair,
BadShape
}
[Serializable]
public class Property
{
private int nbr;
private PropertyType tp;
private string ct;
private string stt;
private PropertyCondition cond;
private short beds;
private float baths;
private int levels;
private int yr;
private decimal val;
public Property()
{
nbr = 0;
tp = PropertyType.Unknown;
ct = "Unknown";
stt = "AA";
cond = PropertyCondition.Unknown;
beds = 0;
baths = 0.00F;
levels = 0;
yr = 1900;
val = 0M;
}
public Property(int propNbr, PropertyType type, string city,
string state, PropertyCondition condition,
short bedrooms, float bathrooms, int stories,
int year, decimal value)
{
nbr = propNbr;
tp = type;
ct = city;
stt = state;
cond = condition;
beds = bedrooms;
baths = bathrooms;
levels = stories;
yr = year;
val = value;
}
public int PropertyNumber
{
get { return nbr; }
set { nbr = value; }
}
public PropertyType Type
{
get { return tp; }
set { tp = value; }
}
public string City
{
get { return ct; }
set { ct = value; }
}
public string State
{
get { return stt; }
set { stt = value; }
}
public PropertyCondition Condition
{
get { return cond; }
set { cond = value; }
}
public short Bedrooms
{
get
{
if (beds <= 1)
return 1;
else
return beds;
}
set { beds = value; }
}
public float Bathrooms
{
get { return (baths <= 0) ? 0.00f : baths; }
set { baths = value; }
}
public int Stories
{
get { return levels; }
set { levels = value; }
}
public int YearBuilt
{
get { return yr; }
set { yr = value; }
}
public decimal MarketValue
{
get { return (val <= 0) ? 0.00M : val; }
set { val = value; }
}
}
}
- In the Solution Explorer, right-click Program.cs and click Rename
- Type AltairRealtors.cs and press Enter twice to display the
file
- Change the file as follows:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace AltairRealtors1
{
public class AltairRealtors
{
public static int Main(string[] args)
{
Property[] lstProperties = new Property[]
{
new Property(524880, PropertyType.SingleFamily, "Silver Spring", "MD",
PropertyCondition.Good, 4, 2.50f, 3, 1995, 495880.00M),
new Property(688364, PropertyType.SingleFamily, "Alexandria", "VA",
PropertyCondition.Excellent, 4, 3.5f, 2, 2000, 620724.00M),
new Property(611464, PropertyType.SingleFamily, "Laurel", "MD",
PropertyCondition.Good, 0, 0F, 2, 0, 422625.00M),
new Property(749562, PropertyType.Townhouse, "Gettysburg", "WV",
PropertyCondition.Good, 3, 2.5F, 3, 2002, 425400.00M),
new Property(420115, PropertyType.Unknown, "Washington", "DC",
PropertyCondition.Unknown, 2, 0F, 0, 1982, 312555.00M),
new Property(200417, PropertyType.Condominium, "Germantown", "MD",
PropertyCondition.Excellent, 2, 1f, 0, 0, 215495.00M),
new Property(927474, PropertyType.Townhouse, "Arlington", "VA",
PropertyCondition.BadShape, 4, 2.5f, 3, 1992, 415665.00M),
new Property(682630, PropertyType.SingleFamily, "Martinsburg", "WV",
PropertyCondition.Good, 4, 3.5f, 3, 2005, 325000.00M),
new Property(288540, PropertyType.Condominium, "Silver Spring", "MD",
PropertyCondition.Good, 1, 1f, 0, 2000, 242775.00M),
new Property(247472, PropertyType.SingleFamily, "Silver Spring", "MD",
PropertyCondition.Excellent, 3, 3f, 3, 1996, 625450.00M),
new Property(297446, PropertyType.Townhouse, "Laurel", "MD",
PropertyCondition.Unknown, 4, 1.5F, 2, 2002, 412885.00M),
new Property(924792, PropertyType.SingleFamily, "Washington", "DC",
PropertyCondition.Good, 5, 3.5F, 3, 2000, 555885.00M),
new Property(294796, PropertyType.SingleFamily, "Falls Church", "VA",
PropertyCondition.Excellent, 5, 2.5f, 2, 1995, 485995.00M),
new Property(811155, PropertyType.Condominium, "Alexandria", "VA",
PropertyCondition.Good, 1, 1.0F, 0, 2000, 352775.00M),
new Property(447597, PropertyType.Townhouse, "Hyattsville", "MD",
PropertyCondition.Excellent, 3, 2f, 3, 1992, 365880.00M),
new Property(297415, PropertyType.Townhouse, "ashington", "DC",
PropertyCondition.Good, 4, 3.5f, 1, 2004, 735475.00M),
new Property(475974, PropertyType.SingleFamily, "Gaithersburg", "MD",
PropertyCondition.Unknown, 4, 2.5f, 1, 1965, 615775.00M),
new Property(927409, PropertyType.Condominium, "McLean", "VA",
PropertyCondition.Excellent, 1, 1f, 12, 2006, 485900.00M),
new Property(304750, PropertyType.Condominium, "Washington", "DC",
PropertyCondition.Unknown, 2, 2f, 6, 1992, 388665.00M),
new Property(207850, PropertyType.Townhouse, "Rockville", "MD",
PropertyCondition.Good, 3, 2.5F, 2, 1988, 525995.00M)
};
FileStream stmProperties = null;
BinaryFormatter bfmProperties = new BinaryFormatter();
// If this directory doesn't exist, create it
Directory.CreateDirectory(@"C:\Altair Realtors");
// This is the file that holds the list of properties
string Filename = @"C:\Altair Realtors\Properties.atr";
// Find out if there is already a file that contains a list of properties.
// If that file exists, open it to get it ready for the new properties.
if (File.Exists(Filename))
{
stmProperties = new FileStream(Filename,
FileMode.Open,
FileAccess.Read,
FileShare.Read);
try
{
// Retrieve the list of items from file
lstProperties =
(Property[])bfmProperties.Deserialize(stmProperties);
}
finally
{
stmProperties.Close();
}
}
// Save the list of properties
stmProperties = new FileStream(Filename,
FileMode.Create,
FileAccess.Write,
FileShare.Write);
try
{
bfmProperties.Serialize(stmProperties, lstProperties);
}
finally
{
stmProperties.Close();
}
return 0;
}
}
}
- Execute the application to create the list
- Close the DOS window and return to your programming environment
- Change the file as follows:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace AltairRealtors1
{
public class AltairRealtors
{
Property[] lstProperties;
public static int Main(string[] args)
{
FileStream stmProperties = null;
AltairRealtors ar = new AltairRealtors();
BinaryFormatter bfmProperties = new BinaryFormatter();
// This is the file that holds the list of properties
string Filename = @"C:\Altair Realtors\Properties.atr";
// Find out if there is already a file that contains a list of properties.
// If that file exists, open it.
if (File.Exists(Filename))
{
stmProperties = new FileStream(Filename,
FileMode.Open,
FileAccess.Read,
FileShare.Read);
try
{
// Retrieve the list of items from file
ar.lstProperties = (Property[])bfmProperties.Deserialize(stmProperties);
}
finally
{
stmProperties.Close();
}
}
return 0;
}
}
}
To support the ability to query a list, you can use the
Language Integrated Query, abbreviated LINQ. To use LINQ in your
application, you must include the System.Core.dll assembly in your
program. If you started your application as an empty project:
- On the main menu, you can click Project -> Add Reference...
- In the Solution Explorer, you can right-click the name of the
project and click Add Reference...
- In the Class View, you can right-click the name of the project and
click Add Reference...
In the .NET tab of the Add Reference dialog box, you can
click System.Core
Then click OK. You must then use the System.Linq
namespace in your code or you can include the using System.Linq; line
in your list of namespaces.
To query a list, you write a statement using words and
operators of the LINQ. The most fundamental operation you can perform on
LINQ consists of creating, also referred to as selecting, or querying, a
list of values, from an existing list such as an array. The basic formula to
use is:
var SubListName = from ValueHolder in List select ValueHolder;
The var keyword, the assignment operator "=", the
from keyword, the in keyword, the select keyword, and
the semicolon are required.
The SubListName is a name of a new variable that
will hold the list of values produced by this operation.
The ValueHolder is the name of a variable that
will be used to identify each resulting member of this operation. This
variable will be equivalent to getting each member of the list and that
responds to a condition.
The List factor represents the name of the
variable that you would have created already. The List can be an
array. Here is an example:
using System;
using System.Linq;
public class Exercise
{
public static int Main()
{
var numbers = new double[] { 12.44, 525.38, 6.28, 2448.32, 632.04 };
var number = from n in numbers select n;
foreach (var member in number)
Console.WriteLine("Member: {0}", member.ToString());
return 0;
}
}
This would produce:
To make the code easier to read, you can spread the
select statement to various lines. Here is an example:
var number = from n
in numbers
select n;
|
|