<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Deborah's Developer MindScape : C#, LINQ</title><link>http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/LINQ/default.aspx</link><description>Tags: C#, LINQ</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>LINQ: Mean, Median, and Mode</title><link>http://msmvps.com/blogs/deborahk/archive/2010/05/07/linq-mean-median-and-mode.aspx</link><pubDate>Fri, 07 May 2010 07:23:34 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1765072</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1765072</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2010/05/07/linq-mean-median-and-mode.aspx#comments</comments><description>&lt;p&gt;If you are doing any type of statistical analysis, you probably need to calculate mean, median and mode. There are lots of places on the Web you can find the calculations. This post is different than most in that it uses LINQ and Lambda expressions.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mean&lt;/strong&gt; is the statistical average of a set of numbers. This one is easy with LINQ because of the Average function.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;int[] numbers = { 4, 4, 4, 4, 3, 2, 2, 2, 1 }; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;double mean = numbers.Average();     &lt;br /&gt;Debug.WriteLine((&amp;quot;Mean: &amp;quot; + mean));&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim numbers() As Integer = {4, 4, 4, 4, 3, 2, 2, 2, 1} &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim mean As Double = numbers.Average()     &lt;br /&gt;Debug.WriteLine(&amp;quot;Mean: &amp;quot; &amp;amp; mean)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The result is:&lt;/p&gt;  &lt;p&gt;Mean: 2.88888888888889&lt;/p&gt;  &lt;p&gt;This code uses the Average extension method on the IEnumerable class to calculate the mean, or average, of the numbers.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Median&lt;/strong&gt; is the middle number of a set of numbers. If there is an even number of entries, it is the average of the two middle numbers.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;int[] numbers = { 4, 4, 4, 4, 3, 2, 2, 2, 1 }; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;int numberCount = numbers.Count();     &lt;br /&gt;int halfIndex = numbers.Count()/2;      &lt;br /&gt;var sortedNumbers = numbers.OrderBy(n=&amp;gt;n);      &lt;br /&gt;double median;      &lt;br /&gt;if ((numberCount % 2) == 0)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; median = ((sortedNumbers.ElementAt(halfIndex) +       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sortedNumbers.ElementAt((halfIndex - 1)))/ 2);      &lt;br /&gt;} else {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; median = sortedNumbers.ElementAt(halfIndex);      &lt;br /&gt;}      &lt;br /&gt;Debug.WriteLine((&amp;quot;Median is: &amp;quot; + median));&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim numbers() As Integer = {4, 4, 4, 4, 3, 2, 2, 2, 1} &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim numberCount As Integer = numbers.Count     &lt;br /&gt;Dim halfIndex As Integer = numbers.Count \ 2      &lt;br /&gt;Dim sortedNumbers = numbers.OrderBy(Function(n) n)      &lt;br /&gt;Dim median As Double      &lt;br /&gt;If (numberCount Mod 2 = 0) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; median = (sortedNumbers.ElementAt(halfIndex) +      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sortedNumbers.ElementAt(halfIndex - 1)) / 2      &lt;br /&gt;Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; median = sortedNumbers.ElementAt(halfIndex)      &lt;br /&gt;End If      &lt;br /&gt;Debug.WriteLine(&amp;quot;Median is: &amp;quot; &amp;amp; median)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The result is:&lt;/p&gt;  &lt;p&gt;Median is: 3&lt;/p&gt;  &lt;p&gt;This code first counts the numbers and divides the count by 2 to find the middle of the list. Note that the VB code uses the backslash (\) to perform an integer division where the C# code uses a forward slash (/) for the division.&lt;/p&gt;  &lt;p&gt;It then sorts the numbers in order using the OrderBy extension method and a Lambda expression that simply orders by the numbers.&lt;/p&gt;  &lt;p&gt;The last step is to get the element at the middle (if odd) or the average of the two middle elements (if even). The result is the median.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mode&lt;/strong&gt; is the number that occurs the largest number of times.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;int[] numbers = { 4, 4, 4, 4, 3, 2, 2, 2, 1 }; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var mode = numbers.GroupBy(n=&amp;gt; n).     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; OrderByDescending(g=&amp;gt; g.Count()).      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Select(g =&amp;gt; g.Key).FirstOrDefault();      &lt;br /&gt;Debug.WriteLine((&amp;quot;Mode is: &amp;quot; + mode));&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim numbers() As Integer = {4, 4, 4, 4, 3, 2, 2, 2, 1} &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim mode = numbers.GroupBy(Function(n) n).     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; OrderByDescending(Function(g) g.Count).      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select(Function(g) g.Key).FirstOrDefault      &lt;br /&gt;Debug.WriteLine(&amp;quot;Mode is: &amp;quot; &amp;amp; mode)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The result is:&lt;/p&gt;  &lt;p&gt;Mode is: 4&lt;/p&gt;  &lt;p&gt;This code uses the GroupBy extension method on IEnumerable to group the numbers by number. It then orders them by the count and selects the first one. This provides the number that occurs the most times.&lt;/p&gt;  &lt;p&gt;Use these techniques whenever you need to calculate the mean, median, or mode.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1765072" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Grouping and Summing with Lambda Expressions</title><link>http://msmvps.com/blogs/deborahk/archive/2010/05/03/grouping-and-summing-with-lambda-expressions.aspx</link><pubDate>Tue, 04 May 2010 05:43:05 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1764810</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1764810</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2010/05/03/grouping-and-summing-with-lambda-expressions.aspx#comments</comments><description>&lt;p&gt;There are often cases where you need to group on multiple properties and potentially sum on others. This post details how to group and sum on multiple properties using lambda expressions.&lt;/p&gt;  &lt;p&gt;This example uses an Invoice class, since that provides many opportunities for summing. First, here is a basic Invoice class.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;class Invoice      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public DateTime InvoiceDate { get; set; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public int InvoiceType { get; set; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public decimal InvoiceAmount { get; set; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public int NumberOfItems { get; set; }       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Public Class Invoice      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Public Property InvoiceDate As DateTime       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Public Property InvoiceType As Integer       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Public Property InvoiceAmount As Decimal       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Public Property NumberOfItems As Integer       &lt;br /&gt;End Class&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Normally, you would populate the Invoice class from data in a database or other data store. But to keep this example simple, the values for the invoices are hard-coded.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;List&amp;lt;Invoice&amp;gt; invoiceList = new List&amp;lt;Invoice&amp;gt;(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;invoiceList = new List&amp;lt;Invoice&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {new Invoice()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceDate=new DateTime(2010,4,30),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceType = 1,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceAmount = 150,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NumberOfItems = 8},       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new Invoice()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceDate=new DateTime(2010,4,29),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceType = 2,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceAmount = 215,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NumberOfItems = 7},       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new Invoice()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceDate=new DateTime(2010,4,30),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceType = 1,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceAmount = 50,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NumberOfItems = 2},       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new Invoice()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceDate=new DateTime(2010,4,29),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceType = 2,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceAmount = 550,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NumberOfItems = 5}};&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim invoiceList As List(Of Invoice) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;invoiceList = New List(Of Invoice) From      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {New Invoice With       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceDate = New DateTime(2010, 4, 30),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceType = 1,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceAmount = 150,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .NumberOfItems = 8},       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; New Invoice With       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceDate = New DateTime(2010, 4, 29),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceType = 2,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceAmount = 215,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .NumberOfItems = 7},       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; New Invoice With       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceDate = New DateTime(2010, 4, 30),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceType = 1,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceAmount = 50,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .NumberOfItems = 2},       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; New Invoice With       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceDate = New DateTime(2010, 4, 29),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceType = 2,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceAmount = 550,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .NumberOfItems = 5}}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This code creates two invoices of type 1 that are dated 4/30/2010 and two invoices of type 2 that are dated 4/29/2010.&lt;/p&gt;  &lt;p&gt;Now for the fun part. This example groups on both the InvoiceDate and the InvoiceType properties. The totals accumulate the invoice amount and the number of items. This allows the code to provide totals based both on the date and type. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var query = invoiceList      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .GroupBy(g =&amp;gt; new { g.InvoiceDate,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; g.InvoiceType })       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Select(group =&amp;gt; new {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceDate = group.Key.InvoiceDate,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvoiceType = group.Key.InvoiceType,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TotalAmount = group.Sum(a=&amp;gt;a.InvoiceAmount),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TotalCount = group.Sum(c=&amp;gt;c.NumberOfItems)});&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim query = invoiceList.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GroupBy(Function(g) New With {Key g.InvoiceDate,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Key g.InvoiceType}).       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select(Function(group) New With {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceDate = group.Key.InvoiceDate,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .InvoiceType = group.Key.InvoiceType,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .TotalAmount = group.Sum(Function(a) a.InvoiceAmount),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .TotalCount = group.Sum(Function(c) c.NumberOfItems)})&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This code starts with a GroupBy clause with a Lambda expression. The Lambda expression (indicated with the =&amp;gt; syntax in C# and the Function keyword in VB) uses the new keyword to create a new anonymous type with two properties: InvoiceDate and InvoiceType. This technique allows the code to group on both properties. More properties can be included here if you need to group on more than two properties.&lt;/p&gt;  &lt;p&gt;Notice the &lt;strong&gt;Key&lt;/strong&gt; modifier on the two properties in the Lambda expression for the VB example. This ensures that the anonymous type is immutable, providing read-only values. This is not necessary in the C# code because C# only supports immutable anonymous types.&lt;/p&gt;  &lt;p&gt;The next part of the above code is a Select clause with another Lambda expression. The Lambda expression uses the new keyword to create an anonymous type with four properties: the invoice date and type from the grouping and the two totals. Each total uses a Sum clause with a Lambda expression defining the property to sum.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;group.Key&lt;/strong&gt; syntax provides the key values from the grouping, which in this case are the properties from our first anonymous type.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;group.Sum&lt;/strong&gt; syntax provides a sum on a particular property in the original list.&lt;/p&gt;  &lt;p&gt;To view the results of the query, the code can display the items.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;foreach (var item in query)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Invoice Date: {0} ({1}) TotalAmount: {2} TotalCount: {3}&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item.InvoiceDate.ToShortDateString(),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item.InvoiceType,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item.TotalAmount,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item.TotalCount);       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;For Each item In query      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Invoice Date: {0} ({1}) TotalAmount: {2} TotalCount: {3}&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item.InvoiceDate.ToShortDateString(),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item.InvoiceType,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item.TotalAmount,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item.TotalCount)       &lt;br /&gt;Next&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The result is as follows:&lt;/p&gt;  &lt;p&gt;Invoice Date: 4/30/2010 (1) TotalAmount: 200 TotalCount: 10    &lt;br /&gt;Invoice Date: 4/29/2010 (2) TotalAmount: 765 TotalCount: 12&lt;/p&gt;  &lt;p&gt;Use this technique any time you need to group or sum information in your business objects.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1764810" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Finding a set of Nodes in an XML String</title><link>http://msmvps.com/blogs/deborahk/archive/2010/03/25/finding-a-set-of-nodes-in-an-xml-string.aspx</link><pubDate>Thu, 25 Mar 2010 16:48:43 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1762339</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1762339</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2010/03/25/finding-a-set-of-nodes-in-an-xml-string.aspx#comments</comments><description>&lt;p&gt;In &lt;a href="http://msmvps.com/blogs/deborahk/archive/2010/01/31/finding-a-node-in-an-xml-string.aspx"&gt;this prior post&lt;/a&gt;, I demonstrated how to find a node in an XML string. In this post, I expand on that topic to find a set of nodes. You can then process those nodes as needed in your application. In this example, the set of nodes are displayed in a ComboBox.&lt;/p&gt;  &lt;p&gt;If you are targeting the .NET Framework version 3.5 or later, you can use Linq to XML to retrieve a set of nodes. This example using Linq.&lt;/p&gt;  &lt;p&gt;Here is the XML we will use in this example:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;lt;States&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;State name=&amp;quot;California&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Regions&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;San Luis Obispo&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Santa Maria&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Seaside&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;Silicon Valley&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;San Jose&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Sunnyvale&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;Springfield&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Emeryville&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Hooterville&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Regions&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/State&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;State name=&amp;quot;Wisconsin&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Regions&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;Milwaukee&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Mukwanago&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Germantown&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;Fox Valley&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Oshkosh&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Appleton&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;Springfield&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Ogdenville&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Shelbyville&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Regions&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/State&amp;gt;      &lt;br /&gt;&amp;lt;/States&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Starting with a simple example, let&amp;#39;s find the set of all regions and display them in a combo box.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Build a list of region names     &lt;br /&gt;var regionElements = doc.Descendants(&amp;quot;Region&amp;quot;);      &lt;br /&gt;var regionEnumeration = regionElements.Select      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (r =&amp;gt; r.Attribute(&amp;quot;name&amp;quot;).Value);      &lt;br /&gt;List&amp;lt;string&amp;gt; regionList = regionEnumeration.ToList();      &lt;br /&gt;regionList.Sort(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Bind to a ComboBox     &lt;br /&gt;comboBox1.DataSource = regionList; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// OR &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;List&amp;lt;string&amp;gt; regions = doc.Descendants(&amp;quot;Region&amp;quot;).Select     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (r =&amp;gt; r.Attribute(&amp;quot;name&amp;quot;).Value).ToList();      &lt;br /&gt;regions.Sort();      &lt;br /&gt;comboBox1.DataSource = regions;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Build a list of region names     &lt;br /&gt;Dim regionElements = doc...&amp;lt;Region&amp;gt;      &lt;br /&gt;Dim regionEnumeration = regionElements.Select(Function(r) r.@name)      &lt;br /&gt;Dim regionList As List(Of String) = regionEnumeration.ToList      &lt;br /&gt;regionList.Sort() &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Bind to a ComboBox     &lt;br /&gt;ComboBox1.DataSource = regionList&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; OR&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim regions As List(Of String) = doc...&amp;lt;Region&amp;gt;.Select _     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (Function(r) r.@name).ToList      &lt;br /&gt;regions.Sort()      &lt;br /&gt;ComboBox1.DataSource = regions&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The code first finds the set of region elements. The C# code uses the XElement methods and the VB code uses XML literals.&lt;/p&gt;  &lt;p&gt;Only the name of the regions are needed, so the next statement selects the name attribute. Again, the C# code uses the XElement methods and the VB code uses XML literals.&lt;/p&gt;  &lt;p&gt;NOTE: You can also use the XElement methods in VB as well.&lt;/p&gt;  &lt;p&gt;The enumeration is then converted to a list so it can be sorted and assigned as a DataSource.&lt;/p&gt;  &lt;p&gt;The second set of code combines the set of Linq to XML statements into one for a more condensed version of the code.&lt;/p&gt;  &lt;p&gt;The result is as follows:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/5126.image_5F00_2C84EA72.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/5126.image_5F00_thumb_5F00_1C09271F.png" width="262" height="215" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Use this technique any time you need to retrieve a set of nodes from an XML file.&lt;/p&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1762339" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Xml/default.aspx">Xml</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Binding to a ComboBox using a DataTable and Linq</title><link>http://msmvps.com/blogs/deborahk/archive/2010/02/27/binding-to-a-combobox-using-a-datatable-and-linq.aspx</link><pubDate>Sun, 28 Feb 2010 01:47:24 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1760130</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1760130</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2010/02/27/binding-to-a-combobox-using-a-datatable-and-linq.aspx#comments</comments><description>&lt;p&gt;If you retrieve data into a DataTable, it is easy to bind it to a ComboBox. And before Linq, you would filter the DataTable using a DataView. But with Linq, you have some easy to use features for filtering the contents of your ComboBox.&lt;/p&gt;  &lt;p&gt;First, here is the basic code for binding a ComboBox to a DataTable.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;private DataTable dt = Customers.Retrieve(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;ComboBox1.DataSource = dt;      &lt;br /&gt;ComboBox1.DisplayMember = &amp;quot;FullName&amp;quot;;       &lt;br /&gt;ComboBox1.ValueMember = &amp;quot;CustomerId&amp;quot;;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Private dt As DataTable = Customers.Retrieve&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;ComboBox1.DataSource = dt      &lt;br /&gt;ComboBox1.DisplayMember = &amp;quot;FullName&amp;quot;       &lt;br /&gt;ComboBox1.ValueMember = &amp;quot;CustomerId&amp;quot;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;The Retrieve method on the Customers class retrieves a DataTable of customers. If you want to try this code, you can build a DataTable in code following the &lt;a href="http://msmvps.com/blogs/deborahk/archive/2010/02/27/build-a-datatable-in-code.aspx"&gt;techniques covered here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;You can then set the DataSource to the DataTable, set the DisplayMember to the name of the field to display in the ComboBox, and set the ValueMember to the name of the field to use as the field value. This is most often the unique key.&lt;/p&gt;  &lt;p&gt;The result looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/3618.image_5F00_61D850DF.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/6740.image_5F00_thumb_5F00_20C9D17B.png" width="415" height="242" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;With Linq you can add filtering criteria. So let&amp;#39;s add a second ComboBox that lists only the customers with a last name that starts with &amp;quot;B&amp;quot;.&lt;/p&gt;  &lt;p&gt;NOTE: Be sure to set a reference to System.Data.DataSetExtensions.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var query = dt.AsEnumerable().Where(c=&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Field&amp;lt;String&amp;gt;(&amp;quot;LastName&amp;quot;).StartsWith(&amp;quot;B&amp;quot;));       &lt;br /&gt;      &lt;br /&gt;ComboBox2.DataSource = query.AsDataView();       &lt;br /&gt;ComboBox2.DisplayMember = &amp;quot;FullName&amp;quot;;       &lt;br /&gt;ComboBox2.ValueMember = &amp;quot;CustomerId&amp;quot;;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim query = dt.AsEnumerable.Where(Function(c) _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Field(Of String)(&amp;quot;LastName&amp;quot;).StartsWith(&amp;quot;B&amp;quot;))       &lt;br /&gt;      &lt;br /&gt;ComboBox2.DataSource = query.AsDataView       &lt;br /&gt;ComboBox2.DisplayMember = &amp;quot;FullName&amp;quot;       &lt;br /&gt;ComboBox2.ValueMember = &amp;quot;CustomerId&amp;quot;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;This code uses a Lambda expression to filter the DataTable to only those rows where the LastName starts with &amp;quot;B&amp;quot;.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;AsEnumerable&lt;/strong&gt; extension method is necessary to allow Linq/Lambda expressions to work with a DataTable. Any field in the DataTable is accessed using c.Field&amp;lt;T&amp;gt; Or c.Field(Of T) where T is the type of the field. In this example, the field is a string.&lt;/p&gt;  &lt;p&gt;The second ComboBox is then bound to the query using the &lt;strong&gt;AsDataView&lt;/strong&gt; extension method. This allows the binding to bind the result as a DataView.&lt;/p&gt;  &lt;p&gt;The result looks like this.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/1663.image_5F00_4AC9CFA3.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/6763.image_5F00_thumb_5F00_660228A4.png" width="347" height="221" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;But wait, there is more. Because of the way that binding works. adding rows to the DataTable will add rows to the first ComboBox that is bound to the DataTable. AND if the new row starts with the letter &amp;quot;B&amp;quot;, it will add it to the second ComboBox as well.&lt;/p&gt;  &lt;p&gt;In this example, code in the Add button does this:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;private void Button1_Click(object sender, EventArgs e)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; dt.Rows.Add(5, &amp;quot;Bond&amp;quot;, &amp;quot;James&amp;quot;, &amp;quot;Bond, James&amp;quot;, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, 3);       &lt;br /&gt;}&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Private Sub Button1_Click2(ByVal sender As System.Object, _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ByVal e As System.EventArgs) Handles Button1.Click       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; dt.Rows.Add(5, &amp;quot;Bond&amp;quot;, &amp;quot;James&amp;quot;, &amp;quot;Bond, James&amp;quot;, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, 3)       &lt;br /&gt;End Sub&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;Click the button and the result is as follows:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/4300.image_5F00_1E409FBD.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/5873.image_5F00_thumb_5F00_2F44CDA0.png" width="244" height="163" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;No refreshing or re-executing binding code required. It just works!!&lt;/p&gt;  &lt;p&gt;Use this technique any time you want to bind a ComboBox to a filtered set of data from a DataTable.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1760130" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/DataTable/default.aspx">DataTable</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Binding/default.aspx">Binding</category></item><item><title>Finding a Node in an XML String</title><link>http://msmvps.com/blogs/deborahk/archive/2010/01/31/finding-a-node-in-an-xml-string.aspx</link><pubDate>Sun, 31 Jan 2010 22:21:40 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1754641</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1754641</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2010/01/31/finding-a-node-in-an-xml-string.aspx#comments</comments><description>&lt;p&gt;A common requirement with an XML file is to find a particular node. If you are targeting the .NET framework 3.5 or higher, you can find the node using Linq to XML or by using Lambda expressions.&lt;/p&gt;  &lt;p&gt;As with many of my prior XML examples, the XML string is as follows:&lt;/p&gt;  &lt;p&gt;&amp;lt;States&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;State name=&amp;quot;Wisconsin&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Regions&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;Milwaukee&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Mukwanago&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Germantown&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;Fox Valley&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Oshkosh&amp;quot; /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Appleton&amp;quot; /&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Regions&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/State&amp;gt;     &lt;br /&gt;&amp;lt;/States&amp;gt;&lt;/p&gt;  &lt;p&gt;The code to find the node for the Milwaukee region is as follows:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Be sure to set a reference to System.Core and System.Xml.Linq      &lt;br /&gt;XElement states&amp;#160; = XElement.Load(&amp;quot;testXML.xml&amp;quot;); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Using LINQ      &lt;br /&gt;XElement foundNode;       &lt;br /&gt;var query = from XElement r in states.Descendants(&amp;quot;Region&amp;quot;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where r.Attribute(&amp;quot;name&amp;quot;).Value == &amp;quot;Milwaukee&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select r;       &lt;br /&gt;foundNode = query.FirstOrDefault(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Using Lambda expressions      &lt;br /&gt;foundNode = states.Descendants(&amp;quot;Region&amp;quot;).       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Where(r =&amp;gt; r.Attribute(&amp;quot;name&amp;quot;).Value ==       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Milwaukee&amp;quot;).FirstOrDefault();&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Be sure to set a reference to System.Core and System.Xml.Linq      &lt;br /&gt;Dim states As XElement = XElement.Load(&amp;quot;testXML.xml&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Using LINQ      &lt;br /&gt;Dim foundNode As XElement       &lt;br /&gt;Dim query = From r As XElement In states...&amp;lt;Region&amp;gt; _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Where r.@&amp;lt;name&amp;gt; = &amp;quot;Milwaukee&amp;quot;       &lt;br /&gt;foundNode = query.FirstOrDefault() &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Using Lambda expression      &lt;br /&gt;foundNode = states...&amp;lt;Region&amp;gt;.Where(Function(r) r.@&amp;lt;name&amp;gt; =&amp;#160; _&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Milwaukee&amp;quot;).FirstOrDefault&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;This code first loads the XML file containing the XML. The next set of code can be done using LINQ or using Lambda expressions. Use either one, but not both. :-)&lt;/p&gt;  &lt;p&gt;The C# code uses the XElement properties and methods. The VB code uses XML literals.&lt;/p&gt;  &lt;p&gt;NOTE: The XElement properties and methods work in VB as well.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;  &lt;p&gt;NOTE: This post was created based on a prior post that included both finding a node and adding new nodes. This post separates the first step to provide a more straightforward example.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1754641" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Xml/default.aspx">Xml</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Populating a DataGridView from Xml Data</title><link>http://msmvps.com/blogs/deborahk/archive/2009/10/20/populating-a-datagridview-from-xml-data.aspx</link><pubDate>Wed, 21 Oct 2009 04:49:09 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1733866</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>15</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1733866</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/10/20/populating-a-datagridview-from-xml-data.aspx#comments</comments><description>&lt;p&gt;If you are using XML in a WinForms application you may find the need to display the XML data in a DataGridView. &lt;/p&gt;  &lt;p&gt;Let&amp;#39;s take this XML:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;lt;states&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;state name=&amp;quot;California&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;abbreviation&amp;gt;CA&amp;lt;/abbreviation&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;year&amp;gt;1850&amp;lt;/year&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;governor&amp;gt;Schwarzenegger&amp;lt;/governor&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/state&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;state name=&amp;quot;Wisconsin&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;abbreviation&amp;gt;WI&amp;lt;/abbreviation&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;year&amp;gt;1848&amp;lt;/year&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;governor&amp;gt;Doyle&amp;lt;/governor&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/state&amp;gt;       &lt;br /&gt;&amp;lt;/states&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Displaying XML in a DataGridView sounds easy, but if you just set the DataGridView DataSource to the XML data, you will get something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/6013.image_5F00_044D9E51.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/0552.image_5F00_thumb_5F00_62EDF8B4.png" width="469" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Notice how it has lots of yuck in it: attribute details, node properties, and so on for every node in the XML. So how do you get something more like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/5758.image_5F00_3ADB4995.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/deborahk.metablogapi/5736.image_5F00_thumb_5F00_64DB47BD.png" width="463" height="203" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The trick is to use anonymous types.&lt;/p&gt;  &lt;p&gt;The code is provided here in VB and C# and then described in detail below.&lt;/p&gt;  &lt;p&gt;NOTE: Be sure to set a reference to &lt;strong&gt;System.Core&lt;/strong&gt; and &lt;strong&gt;System.Xml.Linq&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;XElement statesXml = XElement.Parse(&amp;quot;&amp;lt;states&amp;gt;&amp;quot; +      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;state name=&amp;#39;California&amp;#39;&amp;gt;&amp;quot; +       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;abbreviation&amp;gt;CA&amp;lt;/abbreviation&amp;gt;&amp;quot; +       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;year&amp;gt;1850&amp;lt;/year&amp;gt;&amp;quot; +       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;governor&amp;gt;Schwarzenegger&amp;lt;/governor&amp;gt;&amp;quot; +       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;/state&amp;gt;&amp;quot; +       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;state name=&amp;#39;Wisconsin&amp;#39;&amp;gt;&amp;quot; +       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;abbreviation&amp;gt;WI&amp;lt;/abbreviation&amp;gt;&amp;quot; +       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;year&amp;gt;1848&amp;lt;/year&amp;gt;&amp;quot; +       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;governor&amp;gt;Doyle&amp;lt;/governor&amp;gt;&amp;quot; +       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;&amp;lt;/state&amp;gt;&amp;quot; +       &lt;br /&gt;&amp;#160;&amp;#160; &amp;quot;&amp;lt;/states&amp;gt;&amp;quot;); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var query = from st in statesXml.Descendants(&amp;quot;state&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select new       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Name = st.Attribute(&amp;quot;name&amp;quot;).Value,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Abbrev = st.Element(&amp;quot;abbreviation&amp;quot;).Value,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Year = st.Element(&amp;quot;year&amp;quot;).Value,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Governor = st.Element(&amp;quot;governor&amp;quot;).Value       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };       &lt;br /&gt;DataGridView1.DataSource = query.ToList();&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim statesXml As XElement = _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;states&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;state name=&amp;quot;California&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;abbreviation&amp;gt;CA&amp;lt;/abbreviation&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;year&amp;gt;1850&amp;lt;/year&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;governor&amp;gt;Schwarzenegger&amp;lt;/governor&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/state&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;state name=&amp;quot;Wisconsin&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;abbreviation&amp;gt;WI&amp;lt;/abbreviation&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;year&amp;gt;1848&amp;lt;/year&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;governor&amp;gt;Doyle&amp;lt;/governor&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/state&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/states&amp;gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim query = From st In statesXml...&amp;lt;state&amp;gt; _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select New With { _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Name = st.@name, _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Abbrev = st.&amp;lt;abbreviation&amp;gt;.Value, _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Year = st.&amp;lt;year&amp;gt;.Value, _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Governor = st.&amp;lt;governor&amp;gt;.Value}       &lt;br /&gt;DataGridView1.DataSource = query.ToList&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;The first part of this code builds the XML. The C# code uses the XElement.Parse function to build the XML; VB uses XML literals. This part of the code is not necessary if you are reading the XML from another source, such as a file.&lt;/p&gt;  &lt;p&gt;The second part of the code leverages Linq to XML to process the set of state XML elements. For each element, it uses the Select New syntax to create an anonymous type. The syntax defines an unnamed (anonymous) type with properties Name, Abbrev, Year, and Governor.&lt;/p&gt;  &lt;p&gt;[To view an overview of anonymous types, &lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/08/19/anonymous-types-an-introduction.aspx"&gt;start here&lt;/a&gt;.]&lt;/p&gt;  &lt;p&gt;The last line converts the results of the query to a generic list and assigns it to the DataSource property of the DataGridView. Visual Studio uses the anonymous type property names as the text for the column titles and populates the rows with each state element.&lt;/p&gt;  &lt;p&gt;Use this technique any time you have XML that you want to display in a DataGridView.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1733866" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Xml/default.aspx">Xml</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Binding/default.aspx">Binding</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/WinForms/default.aspx">WinForms</category></item><item><title>Lambda Expressions: Finding an Item in a Generic List</title><link>http://msmvps.com/blogs/deborahk/archive/2009/10/11/lambda-expressions-finding-an-item-in-a-generic-list.aspx</link><pubDate>Sun, 11 Oct 2009 19:52:53 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1731676</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1731676</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/10/11/lambda-expressions-finding-an-item-in-a-generic-list.aspx#comments</comments><description>&lt;p&gt;In &lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/07/03/generics-building-a-list-of-customers.aspx"&gt;this prior post&lt;/a&gt;, I detailed how to build lists of things using a generic List&amp;lt;T&amp;gt;. Once you have a list, you may need to find items in the list. There are several ways to accomplish this, but using lambda expressions is the most concise.&lt;/p&gt;  &lt;p&gt;[To begin with an overview of lambda expressions, &lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/10/11/lambda-expressions-an-introduction.aspx"&gt;start here&lt;/a&gt;.]&lt;/p&gt;  &lt;p&gt;For example, here is how you find an item in a generic list using a for/each statement.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Customer foundCustomer = null;      &lt;br /&gt;foreach (var c in custList)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (c.CustomerId == 4)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foundCustomer = c;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}       &lt;br /&gt;Debug.WriteLine(foundCustomer);&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim foundCustomer As Customer &lt;/font&gt;&lt;font color="#65402e"&gt;&lt;font face="Consolas"&gt;= Nothing        &lt;br /&gt;For Each c As Customer In custList         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; If c.CustomerId = 4 Then         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foundCustomer = c         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Exit For         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End If         &lt;br /&gt;Next         &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;Debug.WriteLine(foundCustomer)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Notice the amount of code required to loop through each item in the list and find the one with a particular customer Id.&lt;/p&gt;  &lt;p&gt;You may have heard about language integrated query (LINQ) and how you can use it to search a&amp;#160; list.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Customer foundCustomer = null;      &lt;br /&gt;var query = from c in custList       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where c.CustomerId == 4       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select c;       &lt;br /&gt;foundCustomer = query.FirstOrDefault();       &lt;br /&gt;Debug.WriteLine(foundCustomer);&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim foundCustomer As Customer = Nothing      &lt;br /&gt;Dim query = From c As Customer In custList _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Where c.CustomerId = 4 _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select c       &lt;br /&gt;foundCustomer = query.FirstOrDefault()       &lt;br /&gt;Debug.WriteLine(foundCustomer)&lt;/font&gt; &lt;/p&gt;  &lt;h6&gt;&lt;font face="Consolas"&gt;&lt;/font&gt;&lt;/h6&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;So LINQ is cool, but the code does not seem much shorter.&lt;/p&gt;  &lt;p&gt;Now let’s look at using lambda expressions to find the item in the list.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt; &lt;font color="#65402e" face="Consolas"&gt;Customer foundCustomer = null;    &lt;br /&gt;foundCustomer = custList.FirstOrDefault(c =&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.CustomerId == 4);     &lt;br /&gt;Debug.WriteLine(foundCustomer);&lt;/font&gt;   &lt;p&gt;The lambda expression syntax in C# looks like this:&lt;/p&gt; c =&amp;gt; c.CustomerId == 4   &lt;p&gt;The code begins with the set of parameters to the lambda expression. The =&amp;gt; is the “goes to” or lambda operator. The remainder of the code is the expression itself. In this case, checking for the item in the list where CustomerId is 4.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim foundCustomer As Customer = Nothing      &lt;br /&gt;foundCustomer = custList.FirstOrDefault(Function(c)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.CustomerId = 4)       &lt;br /&gt;Debug.WriteLine(foundCustomer)&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;The lambda expression syntax in VB looks like this:&lt;/p&gt; Function(c) c.CustomerId = 4   &lt;p&gt;The code begins with the word “Function” along with the set of parameters to the lambda expression. The remainder of the code is the expression itself. In this case, checking the item in the list where CustomerId is 4.&lt;/p&gt;  &lt;p&gt;.NET 3.5 added a large list of extension methods on the Enumerable class. Any object that implements IEnumerable or IEnumerable&amp;lt;T&amp;gt; (basically any object you can do a for/each over) can use these methods. Many of these extension methods (such as the &lt;strong&gt;FirstOrDefault&lt;/strong&gt; method&amp;#160; shown in the above example) support lambda expressions.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;FirstOrDefault&lt;/strong&gt; extension method of the Enumerable class returns the first item in the list or the default value for the object. If you pass it a lambda expression, it returns the first item in the list that matches the Boolean expression.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1731676" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Generics/default.aspx">Generics</category></item><item><title>Enumerable.Repeat</title><link>http://msmvps.com/blogs/deborahk/archive/2009/09/04/enumerable-repeat.aspx</link><pubDate>Fri, 04 Sep 2009 20:57:27 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1720776</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1720776</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/09/04/enumerable-repeat.aspx#comments</comments><description>&lt;p&gt;The &lt;strong&gt;Enumerable&lt;/strong&gt; class is new in .NET 3.5 and is part of the System.Linq namespace. It provides a set of static methods that allow you to query any object that implements IEnumerable, basically meaning any object that supports a for/each.&lt;/p&gt;  &lt;p&gt;This post focuses on the &lt;strong&gt;Repeat&lt;/strong&gt; method of the Enumerable class and some of the helpful things that this class can do for you.&lt;/p&gt;  &lt;p&gt;NOTE: Be sure to set a reference to System.Core.&lt;/p&gt;  &lt;p&gt;First, at the top of your code file, add this code.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;using System.Linq;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Imports System.Linq&lt;/p&gt;  &lt;p&gt;(Or for VB you can import a namespace using the project properties.)&lt;/p&gt;  &lt;p&gt;You can then use the Enumerable.Repeat as shown in the following examples.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Initialize an array to -1 for each of 10 elements     &lt;br /&gt;int[] all1 = Enumerable.Repeat(-1, 10).ToArray(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Initialize an array to &amp;quot;A&amp;quot; for each of 10 elements     &lt;br /&gt;string[] allA = Enumerable.Repeat(&amp;quot;A&amp;quot;, 10).ToArray(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Convert a single value to an array     &lt;br /&gt;int value = 42;      &lt;br /&gt;int[] valueArray = Enumerable.Repeat(value, 1).ToArray(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Generate 10 random numbers     &lt;br /&gt;Random rand = new Random();      &lt;br /&gt;int[] randomArray = Enumerable.Repeat(0, 10).Select(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; i =&amp;gt; rand.Next(0,10)).ToArray(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Initialize a list with 5 Customer objects     &lt;br /&gt;List&amp;lt;Customer&amp;gt; custList = Enumerable.Repeat(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new Customer(), 10).ToList();&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Initialize an array to -1 for each of 10 elements     &lt;br /&gt;Dim all1() As Integer = Enumerable.Repeat(-1, 10).ToArray() &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Initialize an array to &amp;quot;A&amp;quot; for each of 10 elements     &lt;br /&gt;Dim allA() As String = Enumerable.Repeat(&amp;quot;A&amp;quot;, 10).ToArray() &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Convert a single value to an array     &lt;br /&gt;Dim value As Integer = 42      &lt;br /&gt;Dim valueArray() As Integer = Enumerable.Repeat(value, 1).ToArray() &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Generate 10 random numbers     &lt;br /&gt;Dim rand As Random = New Random()      &lt;br /&gt;Dim randomArray() As Integer = Enumerable.Repeat(0, 10).Select( _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Function(i) rand.Next(0, 10)).ToArray() &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Initialize a list with 5 Customer objects     &lt;br /&gt;Dim custList As List(Of Customer) = Enumerable.Repeat( _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; New Customer(), 10).ToList()&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The first example initializes an array of 10 integers to –1.&lt;/p&gt;  &lt;p&gt;The second example initializes an array of 10 strings to &amp;quot;A&amp;quot;.&lt;/p&gt;  &lt;p&gt;The third example takes a single value and creates an array from it. This is often necessary when a method requires an array instead of a single element.&lt;/p&gt;  &lt;p&gt;The random number example provides another way to generate a random numbers. In this case, it generates 10 random numbers between 0 and 9. Note that this does &lt;em&gt;not&lt;/em&gt; ensure uniqueness, so the number 2 for example could occur multiple times in the list.&lt;/p&gt;  &lt;p&gt;The last example initializes a list of business objects to an empty set of objects. You could use object initializer syntax in this example to initialize all of the objects to some set of values, such as setting the State = &amp;quot;CA&amp;quot;. This could be useful in setting up data for testing or prototyping.&lt;/p&gt;  &lt;p&gt;Use the Repeat method any time you want to repeat values in an array or list.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1720776" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Adding Nodes to an XML String</title><link>http://msmvps.com/blogs/deborahk/archive/2009/08/20/adding-nodes-to-an-xml-string.aspx</link><pubDate>Thu, 20 Aug 2009 22:49:58 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1716972</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1716972</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/08/20/adding-nodes-to-an-xml-string.aspx#comments</comments><description>&lt;p&gt;I have an XML string as follows:&lt;/p&gt;  &lt;p&gt;&amp;lt;States&amp;gt;   &lt;br /&gt;&amp;#160; &amp;lt;State name=&amp;quot;Wisconsin&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Regions&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;Milwaukee&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Mukwanago&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Germantown&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;Fox Valley&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Oshkosh&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Appleton&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Regions&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/State&amp;gt;    &lt;br /&gt;&amp;lt;/States&amp;gt;&lt;/p&gt;  &lt;p&gt;I now want to add another area under Milwaukee called &amp;quot;Wauwatosa&amp;quot;.&lt;/p&gt;  &lt;p&gt;The code to accomplish this task is as follows.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt; // Be sure to set a reference to System.Core and System.Xml.Linq     &lt;br /&gt; XElement states&amp;#160; = XElement.Load(&amp;quot;testXML.xml&amp;quot;); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt; // New element under the Milwaukee region     &lt;br /&gt; XElement newElement&amp;#160; = XElement.Parse(@&amp;quot;&amp;lt;Area name=&amp;#39;Wauwatosa&amp;#39;/&amp;gt;&amp;quot;); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Find the desired parent element     &lt;br /&gt; // Using LINQ      &lt;br /&gt; XElement parentNode;      &lt;br /&gt; var parentQuery = from XElement r in states.Descendants(&amp;quot;Region&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where r.Attribute(&amp;quot;name&amp;quot;).Value == &amp;quot;Milwaukee&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select r;      &lt;br /&gt; parentNode = parentQuery.FirstOrDefault(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt; // Using Lambda expression     &lt;br /&gt; parentNode = states.Descendants(&amp;quot;Region&amp;quot;).      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Where(r =&amp;gt; r.Attribute(&amp;quot;name&amp;quot;).Value ==       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;quot;Milwaukee&amp;quot;).FirstOrDefault(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt; if (parentNode != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parentNode.Add(newElement); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt; states.Save(&amp;quot;Revised.xml&amp;quot;);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Be sure to set a reference to System.Core and System.Xml.Linq     &lt;br /&gt;Dim states As XElement = XElement.Load(&amp;quot;testXML.xml&amp;quot;) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; New element under the Milwaukee region     &lt;br /&gt;Dim newElement As XElement = &amp;lt;Area name=&amp;quot;Wauwatosa&amp;quot;/&amp;gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Find the desired parent element     &lt;br /&gt;&amp;#39; Using LINQ      &lt;br /&gt;Dim parentNode As XElement      &lt;br /&gt;Dim parentQuery = From r As XElement In states...&amp;lt;Region&amp;gt; _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Where r.@&amp;lt;name&amp;gt; = &amp;quot;Milwaukee&amp;quot;      &lt;br /&gt;parentNode = parentQuery.FirstOrDefault() &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Using Lambda expression     &lt;br /&gt;parentNode = states...&amp;lt;Region&amp;gt;.Where(Function(r) r.@&amp;lt;name&amp;gt; =&amp;#160; _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;quot;Milwaukee&amp;quot;).FirstOrDefault &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;If (parentNode IsNot Nothing) Then     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; parentNode.Add(newElement)      &lt;br /&gt;End If &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;states.Save(&amp;quot;Revised.xml&amp;quot;)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This code first loads in the XML file containing the XML at the top of this post. The code then defines the new element for Wauwatosa using XML literals in VB and the XElement properties and methods in C#.&lt;/p&gt;  &lt;p&gt;NOTE: The XElement Descendants property works in VB as well.&lt;/p&gt;  &lt;p&gt;The next set of code can be done using LINQ or using Lambda expressions. Use either one, but not both. :-)&lt;/p&gt;  &lt;p&gt;If the appropriate parent element was found, the new element is added to it. The &lt;strong&gt;Add&lt;/strong&gt; method adds the element as a child element.&lt;/p&gt;  &lt;p&gt;Finally, the code saves the revised XML:&lt;/p&gt;  &lt;p&gt;&amp;lt;States&amp;gt;   &lt;br /&gt;&amp;#160; &amp;lt;State name=&amp;quot;Wisconsin&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Regions&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;Milwaukee&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Mukwanago&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Germantown&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Wauwatosa&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Region name=&amp;quot;Fox Valley&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Oshkosh&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Area name=&amp;quot;Appleton&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Region&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Regions&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;/State&amp;gt;    &lt;br /&gt;&amp;lt;/States&amp;gt;&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1716972" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Xml/default.aspx">Xml</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Processing Files Using Anonymous Types</title><link>http://msmvps.com/blogs/deborahk/archive/2009/08/19/processing-files-using-anonymous-types.aspx</link><pubDate>Wed, 19 Aug 2009 21:06:01 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1716708</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1716708</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/08/19/processing-files-using-anonymous-types.aspx#comments</comments><description>&lt;p&gt;Another use of anonymous types is for processing directories or files. For example, your application needs to collect a set of files and then process them based on a subset of the file properties.&lt;/p&gt;  &lt;p&gt;[To begin with an overview of anonymous types, &lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/08/19/anonymous-types-an-introduction.aspx"&gt;start here&lt;/a&gt;.]&lt;/p&gt;  &lt;p&gt;Here is an example.&lt;/p&gt;  &lt;p&gt;In C#:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Query the set of files      &lt;br /&gt;var fileTemplateQuery = from FileInfo f in&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DirectoryInfo(@&amp;quot;C:\temp&amp;quot;)&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .GetFiles(&amp;quot;*.*&amp;quot;, SearchOption.AllDirectories)&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where f.Extension.ToLower() == &amp;quot;.xml&amp;quot; ||&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; f.Extension.ToLower() == &amp;quot;.txt&amp;quot;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select new&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateLastModified = f.LastWriteTime,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Extension = f.Extension,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Size = f.Length,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FileName = f.Name&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;foreach (var f in fileTemplateQuery.OrderBy(file =&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.DateLastModified))       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Do whatever you need to with the files       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.WriteLine(f.FileName);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;In VB:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim fileTemplateQuery = From f As FileInfo In _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; My.Computer.FileSystem.GetDirectoryInfo(&amp;quot;C:\temp&amp;quot;) _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .GetFiles(&amp;quot;*.*&amp;quot;, SearchOption.AllDirectories) _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Where f.Extension.ToLower = &amp;quot;.xml&amp;quot; OrElse _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; f.Extension.ToLower = &amp;quot;.txt&amp;quot; _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select New With _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .DateLastModified = f.LastWriteTime, _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Extension = f.Extension, _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Size = f.Length, _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .FileName = f.Name _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;For Each f In _      &lt;br /&gt;&amp;#160;&amp;#160; fileTemplateQuery.OrderBy(Function(file) file.DateLastModified)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;#39; Do whatever you need to with the files       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.WriteLine(f.FileName)       &lt;br /&gt;Next&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This code uses Linq to find a specific set of files. In this case, it finds all of the files in C:\temp and its subdirectories where the extension is .xml or .txt. It then uses an anonymous type to retain the set of desired file properties.&lt;/p&gt;  &lt;p&gt;The for/each statement loops through the set of anonymous types in order by date and performs whatever operation is required to process the files.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1716708" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Anonymous Types: An Introduction</title><link>http://msmvps.com/blogs/deborahk/archive/2009/08/19/anonymous-types-an-introduction.aspx</link><pubDate>Wed, 19 Aug 2009 19:31:01 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1716697</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1716697</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/08/19/anonymous-types-an-introduction.aspx#comments</comments><description>&lt;p&gt;The last several posts have provided examples of using anonymous types. This post backs up a little and provides an introduction if you are not already familiar with anonymous types.&lt;/p&gt;  &lt;p&gt;If you are familiar with anonymous types and are looking for&amp;#160; more examples, check out these links:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/08/17/defining-lists-of-anonymous-types.aspx"&gt;Defining Lists of Anonymous Types&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/08/19/processing-files-using-anonymous-types.aspx"&gt;Processing Files Using Anonymous Types&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/08/17/counting-words-in-a-string-using-anonymous-types.aspx"&gt;Counting Words in a String Using Anonymous Types&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/10/20/populating-a-datagridview-from-xml-data.aspx"&gt;Populating a DataGridView from Xml Data&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msmvps.com/blogs/deborahk/archive/2010/03/02/lambda-expressions-join.aspx"&gt;Lambda Expressions: Join&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Anonymous types are new in C# 3.0 and VB 9.0 (Visual Studio 2008). An &lt;strong&gt;anonymous type&lt;/strong&gt; allows you to encapsulate a set of properties (not methods) into a specific object without explicitly defining a type.&lt;/p&gt;  &lt;p&gt;When you create a class, such as a Customer class, you are explicitly creating a Customer type with defined properties and methods. The resulting class defines a Customer type which is a &lt;strong&gt;named type&lt;/strong&gt; with the name Customer.&lt;/p&gt;  &lt;p&gt;There are times, however, where you need a temporary type. You could explicitly create this type using a class, but that seems like overkill if you only plan to use the type within one routine. This is where an &lt;strong&gt;anonymous type&lt;/strong&gt; is very useful.&lt;/p&gt;  &lt;p&gt;It is important to note that the properties of an anonymous type are read/write in VB, but read-only in C#.&lt;/p&gt;  &lt;p&gt;You can create an anonymous type manually using the following syntax.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var stats = new {Name = String.Empty, Max = 0,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Min = 0, Ave = 0};&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim stats = New With {.Name = String.Empty, .Max = 0, _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Min = 0, .Ave = 0}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This code creates an anonymous type with Name, Max, Min, and Ave properties. This anonymous type defines some statistics. For example, a list of students each have a set of scores for a class. This anonymous type provides the student&amp;#39;s name and score statistics.&lt;/p&gt;  &lt;p&gt;However, using the syntax in this example is not the usual way to create anonymous types. Rather, the most common technique for creating anonymous types is within a Linq statement.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var scoreQuery = from Student s in Students      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select new&amp;#160; {Name = s.LastName,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Max = s.Scores.Max(),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Min = s.Scores.Min(),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Ave = s.Scores.Average()};       &lt;br /&gt;foreach (var s in scoreQuery)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.Print(&amp;quot;Student Name: {0}&amp;quot;, s.Name);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.Print(&amp;quot;Min: {0}, Max: {1}, Ave: {2}&amp;quot;, s.Max, s.Min, s.Ave);       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim scoreQuery = From s As Student In Students _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select New With {.Name = s.LastName, _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Max = s.Scores.Max(), _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Min = s.Scores.Min(), _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Ave = s.Scores.Average()}       &lt;br /&gt;For Each s In scoreQuery       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.Print(&amp;quot;Student Name: {0}&amp;quot;, s.Name)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.Print(&amp;quot;Min: {0}, Max: {1}, Ave: {2}&amp;quot;, s.Max, s.Min, s.Ave)       &lt;br /&gt;Next&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;NOTE: This code assumes you have a Student class with LastName and Scores properties (see below) and a populated List&amp;lt;Student&amp;gt; with several students and their scores.&lt;/p&gt;  &lt;p&gt;The Linq statement in this example processes each student in the list of students. For each student, it creates an instance of the anonymous type with the student&amp;#39;s name and the appropriate statistics.&lt;/p&gt;  &lt;p&gt;The for/each loops through the resulting set of anonymous types and displays the results.&lt;/p&gt;  &lt;p&gt;In my example, the results are as follows:&lt;/p&gt;  &lt;p&gt;Student Name: Baggins    &lt;br /&gt;Min: 97, Max: 65, Ave: 87.2     &lt;br /&gt;Student Name: Cotton     &lt;br /&gt;Min: 100, Max: 90, Ave: 93.6     &lt;br /&gt;Student Name: Brandybuck     &lt;br /&gt;Min: 88, Max: 65, Ave: 79.6&lt;/p&gt;  &lt;p&gt;Here is the minimum code for the Student class used in this example:&lt;/p&gt;  &lt;p&gt;In C#:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;public class Student      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string LastName { get; set; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public List&amp;lt;int&amp;gt; Scores { get; set; }       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;In VB:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Public Class Student      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Private _LastName As String       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Public Property LastName() As String       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Get       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Return _LastName       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Get       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set(ByVal value As String)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _LastName = value       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Set       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End Property &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; Private _Scores As List(Of Integer)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Public Property Scores() As List(Of Integer)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Get       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Return _Scores       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Get       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set(ByVal value As List(Of Integer))       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _Scores = value       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Set       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End Property &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;End Class&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Anyone else found interesting ways to use anonymous types? I&amp;#39;d enjoy hearing about it…&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1716697" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Defining Lists of Anonymous Types</title><link>http://msmvps.com/blogs/deborahk/archive/2009/08/17/defining-lists-of-anonymous-types.aspx</link><pubDate>Tue, 18 Aug 2009 06:44:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1716376</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1716376</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/08/17/defining-lists-of-anonymous-types.aspx#comments</comments><description>&lt;p&gt;Similar to my prior post &lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/08/17/counting-words-in-a-string-using-anonymous-types.aspx" target="_blank"&gt;here&lt;/a&gt; that details how to use anonymous types to display word counts, this post details how to track information on the physical lines that contain each word. Again, this specific task is more like a homework assignment than a business issue, but it does demonstrate how to work with lists of anonymous types.&lt;/p&gt;  &lt;p&gt;[To begin with an overview of anonymous types, &lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/08/19/anonymous-types-an-introduction.aspx"&gt;start here&lt;/a&gt;.]&lt;/p&gt;  &lt;p&gt;First, the code needs an extension method. This extension method returns a generic List of a particular anonymous type.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;public static List&amp;lt;T&amp;gt; ListOfType&amp;lt;T&amp;gt;(this T type)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return new List&amp;lt;T&amp;gt;();       &lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;NOTE: This code must reside in a module.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;&amp;lt;Extension()&amp;gt; _      &lt;br /&gt;Public Function ListOfType(Of T)(ByVal type As T) As List(Of T)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Return New List(Of T)       &lt;br /&gt;End Function&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Without this extension method, you would have no way to create a List&amp;lt;of anonymous type&amp;gt;. You can use this extension method any time you want to work with a list of your anonymous types.&lt;/p&gt;  &lt;p&gt;The following code defines a list of all words in the sentence along with each physical line containing the word.&lt;/p&gt;  &lt;p&gt;NOTE: Be sure to set a reference to &lt;strong&gt;System.Text.RegularExpressions&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;// Sample string      &lt;br /&gt;string sampleText&amp;#160; = @&amp;quot;That that is, is.&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; That that is not, it not.&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Is that it? It is.&amp;quot;;&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;// Convert to lower case      &lt;br /&gt;sampleText = sampleText.ToLower(); &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;// Split into lines      &lt;br /&gt;char[] lineSeparator =new char[1] {Convert.ToChar(10)};       &lt;br /&gt;string[] lineArray&amp;#160; = sampleText.Split(lineSeparator,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StringSplitOptions.RemoveEmptyEntries); &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;// Define the anonymous type and List(of anonymous type)      &lt;br /&gt;var wordLines = new {Word = String.Empty, Line = 0};       &lt;br /&gt;var listOfWordLines = wordLines.ListOfType(); &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;string lineText;      &lt;br /&gt;string[] lineWords;       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;string[] separators&amp;#160; = new string[4] {&amp;quot; &amp;quot;, &amp;quot;.&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;?&amp;quot;};      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;for (int i = 0; i &amp;lt; lineArray.Count(); i++)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; lineText = Regex.Replace(lineArray[i], @&amp;quot;\s+&amp;quot;, &amp;quot; &amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; lineWords = lineText.Split(separators,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StringSplitOptions.RemoveEmptyEntries); &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;&amp;#160;&amp;#160;&amp;#160; // Using an anonymous type      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int lineNumber = i + 1;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var lineQuery = from string w in lineWords.Distinct()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select new&amp;#160; {Word = w, Line = lineNumber};       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; listOfWordLines.AddRange(lineQuery);       &lt;br /&gt;} &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;var wordGroupQuery = from wordLine in listOfWordLines      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; group wordLine by wordLine.Word into g       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; orderby g.Key       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select new { word = g.Key, wordGroup = g }; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;foreach (var g in wordGroupQuery)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.Write(g.word + &amp;quot;: &amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; foreach (var lineNumber in g.wordGroup)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Debug.Write(lineNumber.Line + &amp;quot; &amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.WriteLine(&amp;quot;&amp;quot;);       &lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;NOTE: For the VB code, be sure to also set a reference to &lt;strong&gt;System.Xml&lt;/strong&gt;, &lt;strong&gt;System.Xml.Linq&lt;/strong&gt;, and &lt;strong&gt;System.Core&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;&amp;#39; Sample string      &lt;br /&gt;Dim sampleText As String = &amp;lt;string&amp;gt;That that is, is.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; That that is not, it not.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Is that it? It is.&amp;lt;/string&amp;gt;.Value&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;&amp;#39; Convert to lower case      &lt;br /&gt;sampleText = sampleText.ToLower &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;&amp;#39; Split into lines      &lt;br /&gt;Dim lineSeparator() As String = {Chr(10)}       &lt;br /&gt;Dim lineArray() As String = sampleText.Split(lineSeparator, _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StringSplitOptions.RemoveEmptyEntries) &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;&amp;#39; Define the anonymous type and List(of anonymous type)      &lt;br /&gt;Dim wordLines = New With {.Word = String.Empty, .Line = 0}       &lt;br /&gt;Dim listOfWordLines = wordLines.ListOfType() &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;Dim lineText As String      &lt;br /&gt;Dim lineWords() As String       &lt;br /&gt;Dim separators() As String = {&amp;quot; &amp;quot;, &amp;quot;.&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;?&amp;quot;}       &lt;br /&gt;For i As Integer = 0 To lineArray.Count - 1       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; lineText = Regex.Replace(lineArray(i), &amp;quot;\s+&amp;quot;, &amp;quot; &amp;quot;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; lineWords = lineText.Split(separators, _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;StringSplitOptions.RemoveEmptyEntries) &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;#39; Using an anonymous type      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Dim lineNumber As Integer = i + 1       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Dim lineQuery = From w As String In lineWords.Distinct _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select New With {.Word = w, .Line = lineNumber}       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; listOfWordLines.AddRange(lineQuery)       &lt;br /&gt;Next &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;Dim wordGroupQuery = From wordLine In listOfWordLines _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Group wordLine By currentWord = wordLine.Word Into Group _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select word = currentWord, wordGroup = Group _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Order By Word &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:consolas;color:#65402e;"&gt;For Each g In wordGroupQuery      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.Write(g.word &amp;amp; &amp;quot;: &amp;quot;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; For Each lineNumber In g.wordGroup       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Debug.Write(lineNumber.Line &amp;amp; &amp;quot; &amp;quot;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Next       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.WriteLine(&amp;quot;&amp;quot;)       &lt;br /&gt;Next&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;This code first builds a sample string. The C# code uses a verbatim string literal (@) to ensure that the string is interpreted verbatim. In VB, the code uses the XML literals feature new in .Net 3.5 to build a sample string.&lt;/p&gt;  &lt;p&gt;The code converts the string to lower case so that the routine treats “The” and “the” as the same word. It then splits the string into its physical lines. The lineArray contains the text of each physical line in the string.&lt;/p&gt;  &lt;p&gt;The next two lines of code define the anonymous type and the List of the anonymous type. You can define any desired properties of an anonymous type by adding them within the { }, separated by commas. In this example, two properties are defined: Word and Line. The &lt;strong&gt;Word&lt;/strong&gt; property is the word from the string. The &lt;strong&gt;Line&lt;/strong&gt; property is the number of the line containing the word. The &lt;strong&gt;ListOfType&lt;/strong&gt; extension method creates a generic List of this type.&lt;/p&gt;  &lt;p&gt;The code then loops through the lineArray. It first removes excess spaces from the line’s text, and any other white-space characters using a Regular Expression. It then splits the line of text into an array of words. If your string includes other punctuation marks, you will need to add them to the separators array.&lt;/p&gt;  &lt;p&gt;The code uses LINQ to find the unique set of words. The &lt;strong&gt;Distinct&lt;/strong&gt; method ensures that only unique words in the line are processed.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;select new&lt;/strong&gt; syntax defines an anonymous type that is the same as the anonymous type defined earlier. This type defines the the set of words and line numbers for each line in the lineArray. The &lt;strong&gt;AddRange&lt;/strong&gt; method of the List is used to append the words for each line into a single list.&lt;/p&gt;  &lt;p&gt;At this point, the list of words and their physical line numbers is complete. The remaining code organizes the list for display. The code uses a Group By query to group the list by word. The final for/each loop then uses the groups to first display the word, then the list of line numbers that contain the word.&lt;/p&gt;  &lt;p&gt;The result is:&lt;/p&gt;  &lt;p&gt;is: 1 2 3    &lt;br /&gt;it: 2 3     &lt;br /&gt;not: 2     &lt;br /&gt;that: 1 2 3 &lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1716376" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Extension+Method/default.aspx">Extension Method</category></item><item><title>Counting Words in a String Using Anonymous Types</title><link>http://msmvps.com/blogs/deborahk/archive/2009/08/17/counting-words-in-a-string-using-anonymous-types.aspx</link><pubDate>Mon, 17 Aug 2009 18:10:53 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1716344</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1716344</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/08/17/counting-words-in-a-string-using-anonymous-types.aspx#comments</comments><description>&lt;p&gt;This may be more of a homework assignment for a programming class than something you would do in your applications, but it is a good example of using anonymous types, which are new in .Net 3.5 in both VB and C#.&lt;/p&gt;  &lt;p&gt;[To begin with an overview of anonymous types, &lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/08/19/anonymous-types-an-introduction.aspx"&gt;start here&lt;/a&gt;.]&lt;/p&gt;  &lt;p&gt;NOTE: Be sure to set a reference to &lt;strong&gt;System.Text.RegularExpressions&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Sample string      &lt;br /&gt;string sampleText&amp;#160; = @&amp;quot;That that is, is.&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; That that is not, it not.&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Is that it? It is.&amp;quot;; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Convert to lower case and convert double-spaces to a single space      &lt;br /&gt;sampleText = sampleText.ToLower();       &lt;br /&gt;sampleText = Regex.Replace(sampleText, @&amp;quot;\s+&amp;quot;, &amp;quot; &amp;quot;);       &lt;br /&gt;string[] separators&amp;#160; = new string[4] {&amp;quot; &amp;quot;, &amp;quot;.&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;?&amp;quot;};       &lt;br /&gt;string[] wordArray = sampleText.Split(separators,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StringSplitOptions.RemoveEmptyEntries); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Sort the result      &lt;br /&gt;Array.Sort(wordArray); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Using an anonymous type      &lt;br /&gt;var query = from string w&amp;#160; in wordArray.Distinct()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select new {Word = w,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Count = wordArray.Count(wordToCount =&amp;gt; wordToCount == w)};       &lt;br /&gt;foreach (var item in query)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.WriteLine(item.Word + &amp;quot;: &amp;quot; + item.Count);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;NOTE: For the VB code, be sure to also set a reference to &lt;strong&gt;System.Xml&lt;/strong&gt;, &lt;strong&gt;System.Xml.Linq&lt;/strong&gt;, and &lt;strong&gt;System.Core&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Sample string      &lt;br /&gt;Dim sampleText As String = &amp;lt;string&amp;gt;That that is, is.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; That that is not, it not.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Is that it? It is.&amp;lt;/string&amp;gt;.Value &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Convert to lower case and convert double-spaces to a single space      &lt;br /&gt;sampleText = sampleText.ToLower       &lt;br /&gt;sampleText = Regex.Replace(sampleText, &amp;quot;\s+&amp;quot;, &amp;quot; &amp;quot;)       &lt;br /&gt;Dim separators() As String = {&amp;quot; &amp;quot;, &amp;quot;.&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;?&amp;quot;}       &lt;br /&gt;Dim wordArray() As String = sampleText.Split(separators,&amp;#160; _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StringSplitOptions.RemoveEmptyEntries) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Sort the result      &lt;br /&gt;Array.Sort(wordArray) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Using an anonymous type      &lt;br /&gt;Dim query = From w As String In wordArray.Distinct _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select New With {.Word = w, _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Count = wordArray.Count(Function(wordToCount) wordToCount = w)}       &lt;br /&gt;For Each item In query&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.WriteLine(item.Word &amp;amp; &amp;quot;: &amp;quot; &amp;amp; item.Count)       &lt;br /&gt;Next&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This code first builds a sample string. (Anyone recognize what movie this string came from?)&lt;/p&gt;  &lt;p&gt;The C# code uses a verbatim string literal (@) to ensure that the string is interpreted verbatim. In VB, the code uses the XML literals feature new in .Net 3.5 to build a sample string.&lt;/p&gt;  &lt;p&gt;The code converts the string to lower case so that the word count counts “The” and “the” as the same word. It then removes excess spaces, linefeeds, and other white-space characters.&lt;/p&gt;  &lt;p&gt;It uses the string Split method to convert the string to an array of words and then sorts the words. If your string includes other punctuation marks, you will need to add them to the separators array.&lt;/p&gt;  &lt;p&gt;The code uses LINQ to find the unique set of words and their counts. The District method is used to process only unique words from the list of words. This prevents duplicate words in the list. &lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;select new&lt;/strong&gt; syntax defines an anonymous type to build a type comprised of the word itself and its count. You can define any desired properties of an anonymous type by adding them within the { }, separated by commas. In this example, two properties are defined: Word and Count. The Word property is the unique word. The Count property is the count of those words within the list. The Count property uses a Lambda expression to count the words.&lt;/p&gt;  &lt;p&gt;Each item of the anonymous type is then displayed to the Debug window as follows:&lt;/p&gt;  &lt;p&gt;is: 5    &lt;br /&gt;it: 3     &lt;br /&gt;not: 2     &lt;br /&gt;that: 5&lt;/p&gt; This lists the word and the number of times it occurs in the string.   &lt;p&gt;Enjoy!&lt;/p&gt;  &lt;p&gt;P.S. (Edited 8/19/09) Though it does not demonstrate anonymous types, Eric Smith provided a *very* concise technique for counting words in a string using regular expressions and lambda expressions (see Comments below). I updated the code slightly to include the OrderBy and I provided the VB version of the code:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;foreach (var g in Regex.Matches(sampleText.ToLower(), @&amp;quot;\w+&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Cast&amp;lt;Match&amp;gt;()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .GroupBy(m =&amp;gt; m.Value)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .OrderBy(m =&amp;gt; m.Key))       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.WriteLine(g.Key + &amp;quot;: &amp;quot; + g.Count());&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;For Each g In Regex.Matches(sampleText.ToLower(), &amp;quot;\w+&amp;quot;) _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Cast(Of Match)() _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .GroupBy(Function(m) m.Value) _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .OrderBy(Function(m) m.Key)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Debug.WriteLine(g.Key &amp;amp; &amp;quot;: &amp;quot; &amp;amp; g.Count())       &lt;br /&gt;Next&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1716344" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Using Linq with Microsoft Word and Excel</title><link>http://msmvps.com/blogs/deborahk/archive/2009/08/14/using-linq-with-microsoft-word-and-excel.aspx</link><pubDate>Fri, 14 Aug 2009 20:14:16 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1715753</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1715753</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/08/14/using-linq-with-microsoft-word-and-excel.aspx#comments</comments><description>&lt;p&gt;Some of the collections in the Microsoft Office object models implement IEnumerable. The IEnumerable interface provides the ability to perform a for/each against the collection. With .NET 3.5, a Cast extension method of IEnumerable allows you to work with these collections using Linq.&lt;/p&gt;  &lt;h2&gt;Microsoft Word&lt;/h2&gt;  &lt;p&gt;For example, say you want to bind the set of open Word document names in a ComboBox.&lt;/p&gt;  &lt;p&gt;First, set a reference to the desired version of the &lt;strong&gt;Microsoft Word Object Library&lt;/strong&gt; from the COM tab of the Add Reference dialog. The resulting reference appears as Microsoft.Office.Interop.Word.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Add to the top of the code file      &lt;br /&gt;using Word = Microsoft.Office.Interop.Word;       &lt;br /&gt;      &lt;br /&gt;// Add to a subroutine       &lt;br /&gt;Word.Application Wd;       &lt;br /&gt;Word.Document doc;       &lt;br /&gt;Word.Document doc2;       &lt;br /&gt;object missingValue = Missing.Value; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Start Word and get Application object      &lt;br /&gt;Wd = new Word.Application(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Define documents      &lt;br /&gt;doc = Wd.Documents.Add(ref missingValue,ref missingValue,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ref missingValue,ref missingValue );       &lt;br /&gt;doc2 = Wd.Documents.Add(ref missingValue, ref missingValue,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ref missingValue, ref missingValue); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Use Linq to access the document names.      &lt;br /&gt;var query = from d in Wd.Documents.Cast&amp;lt;Word.Document&amp;gt;()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select d.Name;       &lt;br /&gt;comboBox1.DataSource = query.ToList(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Or use Lambda expressions      &lt;br /&gt;var query2 = Wd.Documents.Cast&amp;lt;Word.Document&amp;gt;().Select(d=&amp;gt; d.Name);       &lt;br /&gt;comboBox1.DataSource = query2.ToList(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Close      &lt;br /&gt;doc.Close(ref missingValue, ref missingValue, ref missingValue);       &lt;br /&gt;doc = null;       &lt;br /&gt;doc2.Close(ref missingValue, ref missingValue, ref missingValue);       &lt;br /&gt;doc2 = null;       &lt;br /&gt;Wd.Quit(ref missingValue, ref missingValue, ref missingValue); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Clean up      &lt;br /&gt;// NOTE: When in release mode, this does the trick       &lt;br /&gt;GC.WaitForPendingFinalizers();       &lt;br /&gt;GC.Collect();       &lt;br /&gt;GC.WaitForPendingFinalizers();       &lt;br /&gt;GC.Collect() ;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Add to the top of the code file      &lt;br /&gt;Imports Word = Microsoft.Office.Interop.Word&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Add to a subroutine      &lt;br /&gt;Dim Wd As Word.Application       &lt;br /&gt;Dim doc As Word.Document       &lt;br /&gt;Dim doc2 As Word.Document       &lt;br /&gt;      &lt;br /&gt;&amp;#39; Start Word and get Application object       &lt;br /&gt;Wd = New Word.Application&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Define documents      &lt;br /&gt;doc = Wd.Documents.Add       &lt;br /&gt;doc2 = Wd.Documents.Add &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Use Linq to access the document names.      &lt;br /&gt;Dim query = From d In Wd.Documents.Cast(Of Word.Document)() _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select d.Name       &lt;br /&gt;ComboBox1.DataSource = query.ToList &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Or use Lambda expressions      &lt;br /&gt;Dim query2 = Wd.Documents.Cast(Of Word.Document) _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Select(Function(d) d.Name)       &lt;br /&gt;ComboBox1.DataSource = query2.ToList &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Close      &lt;br /&gt;doc.Close()       &lt;br /&gt;doc = Nothing       &lt;br /&gt;doc2.Close()       &lt;br /&gt;doc2 = Nothing       &lt;br /&gt;Wd.Quit() &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Clean up      &lt;br /&gt;&amp;#39; NOTE: When in release mode, this does the trick       &lt;br /&gt;GC.WaitForPendingFinalizers()       &lt;br /&gt;GC.Collect()       &lt;br /&gt;GC.WaitForPendingFinalizers()       &lt;br /&gt;GC.Collect()&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;In both of these examples, the code starts Word, creates two Word documents, uses either Linq or a Lambda expression to define a query and then binds the resulting set of document names to a Combo Box.&lt;/p&gt;  &lt;p&gt;Notice the missingValue variable in the C# code that is not in the VB code. VB supports default parameters, but C# does not. So any time a parameter is defined for a Word method, C# must provide it. VB will use the default parameter values.&lt;/p&gt;  &lt;p&gt;NOTE: A new feature in C# 4.0 (Visual Studio 2010) allows for default parameters in C# as well, dramatically simplifying the C# code that interacts with Word or Excel.&lt;/p&gt;  &lt;p&gt;As another example, the following code retrieves all of the words from the defined Word document.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt; &lt;font color="#65402e" face="Consolas"&gt;var query = from w in doc.Words.Cast&amp;lt;Word.Range&amp;gt;()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select w.Text;     &lt;br /&gt;comboBox1.DataSource = query.ToList();&lt;/font&gt;   &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim query = From w In doc.Words.Cast(Of Word.Range)() _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select w.Text       &lt;br /&gt;ComboBox1.DataSource = query3.ToList&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This code retrieves all of the words in the document defined by the doc variable. Instead of selecting the list of words, you could use any Linq feature such as finding only a specific set of words that match a criteria or counting the number of occurrences of a given word.&lt;/p&gt;  &lt;h2&gt;Microsoft Excel&lt;/h2&gt;  &lt;p&gt;This technique works with Excel as well. Say you want to bind the list of spreadsheets in an Excel workbook.&lt;/p&gt;  &lt;p&gt;First, set a reference to the desired version of the &lt;strong&gt;Microsoft Excel Object Library&lt;/strong&gt; from the COM tab of the Add Reference dialog. The resulting reference appears as Microsoft.Office.Interop.Excel.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Add to the top of the code file      &lt;br /&gt;using Excel = Microsoft.Office.Interop.Excel;       &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Add to a subroutine      &lt;br /&gt;Excel.Application oXL;       &lt;br /&gt;Excel.Workbook oWB;       &lt;br /&gt;Excel.Worksheet oSheet;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Start Excel and get Application object.      &lt;br /&gt;oXL = new Excel.Application(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Get a new workbook.      &lt;br /&gt;oWB = oXL.Workbooks.Add(Missing.Value); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Get the active sheet and change its name      &lt;br /&gt;oSheet = (Excel.Worksheet)oWB.ActiveSheet ;       &lt;br /&gt;oSheet.Name = &amp;quot;Test&amp;quot;;       &lt;br /&gt;      &lt;br /&gt;// Use Linq to access the spreadsheet names.       &lt;br /&gt;var query = from s in oXL.Worksheets.Cast&amp;lt;Excel.Worksheet&amp;gt;()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select s.Name;       &lt;br /&gt;comboBox1.DataSource = query.ToList(); &lt;/font&gt;&lt;/p&gt; &lt;font color="#65402e" face="Consolas"&gt;// Or use Lambda expressions.    &lt;br /&gt;var query2 = oXL.Worksheets.Cast&amp;lt;Excel.Worksheet&amp;gt;()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .select(s =&amp;gt; s.Name);     &lt;br /&gt;comboBox1.DataSource = query2.ToList(); &lt;/font&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Close      &lt;br /&gt;oSheet = null;       &lt;br /&gt;oWB.Close(Missing.Value, Missing.Value, Missing.Value);       &lt;br /&gt;oWB = null;       &lt;br /&gt;oXL.Quit(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;// Clean up      &lt;br /&gt;// NOTE: When in release mode, this does the trick       &lt;br /&gt;GC.WaitForPendingFinalizers();       &lt;br /&gt;GC.Collect();       &lt;br /&gt;GC.WaitForPendingFinalizers();       &lt;br /&gt;GC.Collect();&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Add to the top of the code file      &lt;br /&gt;Imports Excel = Microsoft.Office.Interop.Excel &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Add to a subroutine      &lt;br /&gt;Dim oXL As Excel.Application       &lt;br /&gt;Dim oWB As Excel.Workbook       &lt;br /&gt;Dim oSheet As Excel.Worksheet       &lt;br /&gt;      &lt;br /&gt;&amp;#39; Start Excel and get Application object.       &lt;br /&gt;oXL = New Excel.Application       &lt;br /&gt;      &lt;br /&gt;&amp;#39; Get a new workbook.       &lt;br /&gt;oWB = oXL.Workbooks.Add       &lt;br /&gt;      &lt;br /&gt;&amp;#39; Get the active sheet and change its name       &lt;br /&gt;oSheet = DirectCast(oWB.ActiveSheet, Excel.Worksheet)       &lt;br /&gt;oSheet.Name = &amp;quot;Test&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Use Linq to access the spreadsheet names.      &lt;br /&gt;Dim query = From s In oXL.Worksheets.Cast(Of Excel.Worksheet)() _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select s.Name       &lt;br /&gt;ComboBox1.DataSource = query.ToList       &lt;br /&gt;      &lt;br /&gt;&amp;#39; Or use Lambda expressions       &lt;br /&gt;Dim query2 = oXL.Worksheets.Cast(Of Excel.Worksheet) _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Select(Function(s) s.Name)       &lt;br /&gt;ComboBox1.DataSource = query2.ToList&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#39; Close      &lt;br /&gt;oSheet = Nothing       &lt;br /&gt;oWB.Close()       &lt;br /&gt;oWB = Nothing       &lt;br /&gt;oXL.Quit()       &lt;br /&gt;      &lt;br /&gt;&amp;#39; Clean up       &lt;br /&gt;&amp;#39; NOTE: When in release mode, this does the trick       &lt;br /&gt;GC.WaitForPendingFinalizers()       &lt;br /&gt;GC.Collect()       &lt;br /&gt;GC.WaitForPendingFinalizers()       &lt;br /&gt;GC.Collect()&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;In both examples, the code starts Excel, changes the name of the active sheet, uses either Linq or a Lambda expression to define a query and then binds the resulting set of sheet names to a Combo Box.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;  &lt;p&gt;EDITED 11/16/09: Added information on setting the appropriate reference.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1715753" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Binding/default.aspx">Binding</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Excel/default.aspx">Excel</category></item><item><title>Inferred Typing</title><link>http://msmvps.com/blogs/deborahk/archive/2009/07/28/inferred-typing.aspx</link><pubDate>Tue, 28 Jul 2009 19:01:57 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1710593</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1710593</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/07/28/inferred-typing.aspx#comments</comments><description>&lt;p&gt;If you are using Visual Studio 2008 (.NET Framework 3.5) or newer, you can leverage inferred typing. Inferred typing allows the compiler to infer your data types instead of you having to explicitly define the type. Variables that use inferred typing are still strongly typed, they just depend on .NET for determining (or inferring) the type. &lt;/p&gt;  &lt;p&gt;Inferred typing is sometimes referred to as “duck typing”. This is from the truth that if something looks like a duck and quacks like a duck, it must be a duck. For more general information on inferred typing (or type inference), see &lt;a href="http://en.wikipedia.org/wiki/Inferred_typing" target="_blank"&gt;this&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The compiler infers your data type based on its context. Here are some examples.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var i = 1;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var x = &amp;quot;Hello&amp;quot;;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var arr = new int[] {1, 2, 3, 4};&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var c = new Customer();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var y = null; // Generates an error&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;To use inferred typing in C#, use the &lt;strong&gt;var&lt;/strong&gt; keyword as in the above examples. Note that var is &lt;em&gt;not&lt;/em&gt; short for variant and does not imply that the variables are weakly typed. Rather, the var keyword defines that the compiler should infer the type based on the context.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim i = 1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim x = &amp;quot;Hello&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim arr() = New Integer() {1, 2, 3, 4}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim c = new Customer()&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim y = Nothing&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;To use inferred typing in VB, you need to set Option Infer On:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Double-Click on My Project under Solution Explorer. &lt;/li&gt;    &lt;li&gt;Click the Compile tab. &lt;/li&gt;    &lt;li&gt;Set Option Infer On. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;If Option Infer is On, simply Dim the variable to take advantage of inferred typing. This does &lt;em&gt;not&lt;/em&gt; imply that the variables are weakly typed or are of type Object. Rather, using Dim without a data type when Option Infer is On defines that the compiler should infer the type based on the context.&lt;/p&gt;  &lt;p&gt;In the first example under either language, the inferred type of&lt;strong&gt; i&lt;/strong&gt; is integer because it is assigned to 1. In the second example, &lt;strong&gt;x&lt;/strong&gt; is inferred to be of type string. The &lt;strong&gt;arr&lt;/strong&gt; variable is inferred to be of an integer array type.&lt;/p&gt;  &lt;p&gt;The fourth example infers the type of &lt;strong&gt;c &lt;/strong&gt;to be Customer and creates a new instance of the Customer class. This is less necessary as a shortcut in VB where you can also do this:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim c as New Customer&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;In the last example, VB infers the type of &lt;strong&gt;y&lt;/strong&gt; to be Object. C# won’t attempt to infer the type and instead generates a compile error.&lt;/p&gt;  &lt;p&gt;You can view the type that is inferred by hovering over the value in the Visual Studio text editor. In VB, hover over the variable. In C#, hover over the var keyword.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;BUT – is this a good idea?&lt;/strong&gt; Should you be leaving it up to the compiler to define your types?&lt;/p&gt;  &lt;p&gt;The recommended best practice regarding inferred typing is as follows:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Do NOT use inferred typing for variables of intrinsic types (like in the above integer and string examples). &lt;/li&gt;    &lt;li&gt;DO use inferred typing when creating a new instance, such as in the new Customer example. &lt;/li&gt;    &lt;li&gt;DO use inferred typing when dealing with anonymous types (see &lt;a href="http://msdn.microsoft.com/en-us/library/bb397696.aspx" target="_blank"&gt;this&lt;/a&gt; or &lt;a href="http://msdn.microsoft.com/en-us/library/bb384767.aspx" target="_blank"&gt;this&lt;/a&gt;). &lt;/li&gt;    &lt;li&gt;DO use inferred typing when working with LINQ and Lambda expressions. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Though a quick Bing of this topic shows that not all developers agree with these guidelines.&lt;/p&gt;  &lt;p&gt;A common use of inferred typing is with LINQ and Lambda expressions because the data types of these expressions are often long and tedious.&lt;/p&gt;  &lt;p&gt;For example:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;List&amp;lt;int&amp;gt; myList = new List&amp;lt;int&amp;gt;() { 1, 6, 8, 3, 2, 4, 15 }; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var result = from item in myList      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where item &amp;lt; 5       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select item;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim myArr() As Integer = {1, 6, 8, 3, 2, 4, 15}      &lt;br /&gt;Dim myList As List(Of Integer) = myArr.ToList &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim result = From item In myList _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Where item &amp;lt; 5 _       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select item&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;NOTE: VB does not support List initializers but it does support array initializers. So to simplify the amount of code, an array initializer was used and then the array was converted to a List.&lt;/p&gt;  &lt;p&gt;In both cases, the result variable type is System.Collections.Generic.IEnumerable&amp;lt;int&amp;gt;. Yuck!&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;  &lt;p&gt;&lt;font style="background-color:#ffff00;"&gt;EDIT: 8/26/12&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Two things to add to this:&lt;/p&gt;  &lt;p&gt;1) VB does now support List initializers as of VB 10 (VS 2010).&lt;/p&gt;  &lt;p&gt;2) In practice over the past few years, I have found that I also ignore the first recommendation for inferred typing. Why include the name of the type (string or int) when it is so obvious that you are assigning to a string or an integer?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1710593" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Linq: Sorting a DataTable</title><link>http://msmvps.com/blogs/deborahk/archive/2009/07/23/linq-sorting-a-datatable.aspx</link><pubDate>Thu, 23 Jul 2009 23:24:46 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1707374</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1707374</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/07/23/linq-sorting-a-datatable.aspx#comments</comments><description>&lt;p&gt;Last night, my husband (who is also a .NET developer) asked me about sorting a DataTable by user-defined columns. (Yes, we are a pretty exciting couple!)&lt;/p&gt;  &lt;p&gt;Most developers that work with DataTables know how to sort the DataTable using a DataView.Sort. If you are interested in that technique, you can view the msdn documentation &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.dataview.sort.aspx" target="_blank"&gt;here&lt;/a&gt;. This post is about sorting using Linq.&lt;/p&gt;  &lt;p&gt;NOTE: Be sure to set a reference to &lt;strong&gt;System.Data.DatasetExtensions&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;If you know ahead of time which columns of the DataTable should be sorted, you can use LINQ to DataTables like this.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var query = from c in dt.AsEnumerable()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; orderby c.Field&amp;lt;DateTime?&amp;gt;(&amp;quot;LastPurchaseDate&amp;quot;),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Field&amp;lt;string&amp;gt;(&amp;quot;LastName&amp;quot;) descending      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select c;      &lt;br /&gt;DataView dv&amp;#160;&amp;#160; = query.AsDataView();&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim query = From c In dt.AsEnumerable _     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Order By c.Field(Of DateTime?)(&amp;quot;LastPurchaseDate&amp;quot;), _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c.Field(Of String)(&amp;quot;LastName&amp;quot;) Descending      &lt;br /&gt;Dim dv As DataView = query.AsDataView&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;The dt variable represents the table you wish to sort. The AsEnumerable is an extension method on the DataTable that allows you to use Linq with it. The Order By clause takes any number of columns. You must specify the data type and then the column name or index. To sort descending, use the Descending keyword.&lt;/p&gt;  &lt;p&gt;A nullable DateTime (represented by DateTime?) ensures that the code correctly handles any null values in the table.&lt;/p&gt;  &lt;p&gt;In the above examples, the data is sorted first by LastPurchaseDate (ascending) and then by LastName (descending).&lt;/p&gt;  &lt;p&gt;The resulting DataView can be bound to a grid or other control.&lt;/p&gt;  &lt;p&gt;If you prefer Lambda expressions, you can do this same sort as follows:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var query2 = dt.AsEnumerable()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#65402e" face="Consolas"&gt;.OrderBy(c=&amp;gt; c.Field&amp;lt;DateTime?&amp;gt;(&amp;quot;LastPurchaseDate&amp;quot;))     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .ThenByDescending(c=&amp;gt; c.Field&amp;lt;string&amp;gt;(&amp;quot;LastName&amp;quot;));      &lt;br /&gt;&lt;/font&gt;&lt;font color="#65402e" face="Consolas"&gt;DataView dv2&amp;#160;&amp;#160; = query.AsDataView();&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim query2 = dt.AsEnumerable _     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; .OrderBy(Function(c) c.Field(Of DateTime?)(&amp;quot;LastPurchaseDate&amp;quot;)) _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; .ThenByDescending(Function(c) c.Field(Of String)(&amp;quot;LastName&amp;quot;))      &lt;br /&gt;Dim dv2 As DataView = query.AsDataView&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;This code performs the same sort as the prior examples.&lt;/p&gt;  &lt;p&gt;But neither of these techniques work well if you want the user to select any number of columns to use for the sort. In that case, you need something a little more full-featured.&lt;/p&gt;  &lt;p&gt;The first step to building a more generalized sort is to build your own comparer class.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;private class RowComparer : IComparer&amp;lt;DataRow&amp;gt;     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public Dictionary&amp;lt;int, SortOrder&amp;gt; SortColumns { get; set; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; public int Compare(System.Data.DataRow x, System.Data.DataRow y)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int returnValue&amp;#160; = 0;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (int key in SortColumns.Keys)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int compareResult ; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Check for nulls     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (x.ItemArray[key] == DBNull.Value       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;&amp;amp; y.ItemArray[key] == DBNull.Value)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; compareResult = 0;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if (x.ItemArray[key] == DBNull.Value)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; compareResult = -1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if (y.ItemArray[key] == DBNull.Value)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; compareResult = 1;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Execute the compare based on the column type      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (x.Table.Columns[key].DataType.Name ==       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(Decimal).Name)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; compareResult =       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Decimal.Compare((decimal)x.ItemArray[key],       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (decimal)y.ItemArray[key]); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if (x.Table.Columns[key].DataType.Name ==      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(DateTime).Name)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; compareResult =       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateTime.Compare((DateTime)x.ItemArray[key],       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (DateTime)y.ItemArray[key]);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Compare anything else as a string      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; compareResult =       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String.Compare(x.ItemArray[key].ToString(),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; y.ItemArray[key].ToString());      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (compareResult != 0)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnValue =       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SortColumns[key] == SortOrder.Ascending ?       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; compareResult: -compareResult;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return returnValue;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Public Class RowComparer     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Implements IComparer(Of DataRow) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; Private _sortColumns As Dictionary(Of Integer, SortOrder)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Public Property SortColumns() As Dictionary(Of Integer, SortOrder)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Get      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Return _sortColumns      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Get      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set(ByVal value As Dictionary(Of Integer, SortOrder))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _sortColumns = value      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Set      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End Property &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; Public Function Compare(ByVal x As System.Data.DataRow, _     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ByVal y As System.Data.DataRow) As Integer _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Implements System.Collections.Generic.IComparer( _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Of System.Data.DataRow).Compare      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim returnValue As Integer = 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each key As Integer In SortColumns.Keys      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim compareResult As Integer &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;#39; Handle DBNull.     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim xValue As Object = _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If(x.Item(key) Is DBNull.Value, Nothing, x.Item(key))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim yValue As Object = _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If(y.Item(key) Is DBNull.Value, Nothing, y.Item(key)) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;#39; Execute the appropriate compare based on the column type     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Select Case x.Table.Columns(key).DataType.Name      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Case GetType(Decimal).Name      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; compareResult = _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Decimal.Compare(CType(xValue, Decimal), _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#65402e" face="Consolas"&gt; CType(yValue, Decimal)) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Case GetType(DateTime).Name     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; compareResult = _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateTime.Compare(CType(xValue, DateTime), _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CType(yValue, DateTime)) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Case Else     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;#39; Compare anything else as a string      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; compareResult = _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String.Compare(x.Item(key).ToString, _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; y.Item(key).ToString)      &lt;br /&gt;&lt;/font&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Select &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If compareResult &amp;lt;&amp;gt; 0 Then     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; returnValue = _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If(SortColumns(key) = SortOrder.Ascending, _      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; compareResult, -compareResult)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Exit For      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Return returnValue &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; End Function     &lt;br /&gt;End Class&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;This class defines a comparer to use when sorting a DataRow. The sortColumns property is a Dictionary that stores the index of the column to use as the sort, and a SortOrder to define whether to sort ascending or descending. Presumably, the values for this Dictionary were obtained from the user.&lt;/p&gt;  &lt;p&gt;The Compare method does all of the work. It compares any two DataRows to determine how each row should be sorted against any other row. The method processes each of the sortColumns. &lt;/p&gt;  &lt;p&gt;First, it checks for a DBNull. The DBNull checking is different in the C# code and VB code. The C# code checks for a DBNull and manually sets the result of the compare. The VB code simply sets the value to Nothing if it is DBNull.&lt;/p&gt;  &lt;p&gt;The code performs a compare based on the type of column. This is necessary because the user would expect decimals to sort as numbers, not as strings. You can add any other data types here as you require. Any data types not specifically handled will be handled as a string.&lt;/p&gt;  &lt;p&gt;Note that a Select/Case statement was used in VB, but if/else if was used in C#. This is because C# requires its switch/case statements to switch based on constant values, not variables.&lt;/p&gt;  &lt;p&gt;Regardless of the datatype, the result of the type-specific compare method is:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;-1: If the value of x is less than the value of y.&lt;/li&gt;    &lt;li&gt;1: if the value of x is great than the value of y.&lt;/li&gt;    &lt;li&gt;0: if the value of x and y are equal.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If the resulting value is not 0, the loop can exit because the comparison is complete. If the resulting value is 0, meaning the columns are equal, the loop continues and the next column in the set of sort columns is checked.&lt;/p&gt;  &lt;p&gt;You then use this class as follows.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In C#:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dictionary&amp;lt;int, SortOrder&amp;gt; sortColumns =      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new Dictionary&amp;lt;int, SortOrder&amp;gt;();      &lt;br /&gt;sortColumns.Add(2,SortOrder.Ascending);      &lt;br /&gt;sortColumns.Add(1, SortOrder.Descending); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;RowComparer comp = new RowComparer();     &lt;br /&gt;comp.SortColumns = sortColumns; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;var query3 = dt.AsEnumerable().OrderBy(q =&amp;gt; q, comp);     &lt;br /&gt;DataView dv3 = query3.AsDataView();&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In VB:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim sortColumns As New Dictionary(Of Integer, SortOrder)     &lt;br /&gt;sortColumns.Add(2, SortOrder.Ascending)      &lt;br /&gt;sortColumns.Add(1, SortOrder.Descending) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim comp As New RowComparer     &lt;br /&gt;comp.SortColumns = sortColumns &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim query3 = dt.AsEnumerable.OrderBy(Function(q) q, comp)     &lt;br /&gt;Dim dv3 As DataView = query3.AsDataView&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;The first set of code sets up the Dictionary of sort columns. The sort columns are hard-coded in this example, but presumably they would come from the user.&lt;/p&gt;  &lt;p&gt;The code then creates an instance of the new RowComparer class and passes in the set of columns.&lt;/p&gt;  &lt;p&gt;NOTE: You could define a parameterized constructor and pass in the sorted columns instead of using a property, if desired.&lt;/p&gt;  &lt;p&gt;The Lambda expression to perform the sort is then greatly simplified. It just passes in the desired comparer.&lt;/p&gt;  &lt;p&gt;That’s it. You now have the ability to sort your DataTable using any user-defined set of columns.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1707374" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/DataTable/default.aspx">DataTable</category></item><item><title>Zodiac Sign: ZodiacSigns Class</title><link>http://msmvps.com/blogs/deborahk/archive/2009/07/06/zodiac-sign-zodiacsigns-class.aspx</link><pubDate>Mon, 06 Jul 2009 21:53:16 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1698496</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1698496</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/07/06/zodiac-sign-zodiacsigns-class.aspx#comments</comments><description>&lt;p&gt;This entry details the implementation of the ZodiacSigns class from &lt;a href="http://msmvps.com/blogs/deborahk/archive/2009/07/06/applying-oop-to-simple-situations-chinese-zodiac-signs.aspx"&gt;this example&lt;/a&gt; in C#:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;public class ZodiacSigns : List&amp;lt;ZodiacSign&amp;gt;      &lt;br /&gt;{&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;h1&gt;Constructor&lt;/h1&gt;  &lt;p&gt;The following is the constructor defined in the ZodiacSigns class:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;public ZodiacSigns()     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; InitializeCollection();      &lt;br /&gt;}&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;This constructor ensures that the collection of zodiac signs is initialized when an instance of this class is created.&lt;/p&gt;  &lt;h1&gt;Methods&lt;/h1&gt;  &lt;p&gt;The following are the methods in the ZodiacSigns class:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;public string FindSign(DateTime desiredDate)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Find the name of the Zodiak sign with the date within the ranges      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var query = from z in this      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; from d in z.DateRanges      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where (desiredDate &amp;gt;= d.StartDate) &amp;amp;&amp;amp;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#65402e" face="Consolas"&gt;(desiredDate &amp;lt;= d.EndDate)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select z.Name;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; string name = query.FirstOrDefault();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return name;      &lt;br /&gt;}&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;The FindSign method uses LINQ to find the date within the defined ranges. It returns the name of the appropriate sign.&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;private void InitializeCollection()     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // This could potentially read all of these from a file.      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // NOTE: This data may not be accurate      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Rat&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(1996, 2,19),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(1997, 2,6)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2008, 2,7),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2009, 2,25))}));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Ox&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(1997, 2,7),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(1998, 2,27)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2009, 2,26),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2010, 2,13))}));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Tiger&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(1998, 2,28),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(1999, 2,15)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2010, 2,14),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2011, 2,2))}));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Rabbit&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(1999, 2,16),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2000, 2,4)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2011, 2,3),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2012, 1,22))}));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Drago&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2000, 2,5),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2001, 2,23)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2012, 1,23),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2013, 2,9))}));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Snake&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2001, 1,24),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2002, 2,11)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2013, 2,10),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2014, 1,30))}));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Horse&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2002, 2,12),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2003, 1,31)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2014, 1,31),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2015, 2,18))}));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Sheep&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2003, 2,1),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2004, 2,21)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2015, 2,19),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2016, 2,7))}));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Monkey&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2004, 1, 22),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2005, 2, 8)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2016, 2, 8),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2017, 1, 27))}));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Rooster&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2005, 2, 9),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2006, 1, 28)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2017, 1, 28),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2018, 2, 15))}));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Dog&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2006, 1, 29),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2007, 2, 17)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2018, 2, 16),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2019, 2, 4))}));      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; this.Add(new ZodiacSign(&amp;quot;Pig&amp;quot;,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new List&amp;lt;DateRange&amp;gt; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2007, 2, 18),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2008, 2, 6)),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateRange(new DateTime(2019, 2, 5),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new DateTime(2020, 2, 21))}));      &lt;br /&gt;}&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;The InitializeCollection method does exactly what it sounds like … creating the set of date ranges associated with each zodiac sign. This code takes advantage of the list initializers now available in C#.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1698496" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/OOP/default.aspx">OOP</category></item><item><title>LINQ: Defining a List of Integers</title><link>http://msmvps.com/blogs/deborahk/archive/2009/07/03/linq-defining-a-list-of-integers.aspx</link><pubDate>Fri, 03 Jul 2009 16:39:05 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1697724</guid><dc:creator>Deborah Kurata</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/deborahk/rsscomments.aspx?PostID=1697724</wfw:commentRss><comments>http://msmvps.com/blogs/deborahk/archive/2009/07/03/linq-defining-a-list-of-integers.aspx#comments</comments><description>&lt;p&gt;Defining a list of integers in your code involves lots of tedious typing.&lt;/p&gt;  &lt;p&gt;In VB, you can’t do this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;font color="#65402e"&gt;&amp;#39;Dim numberList As new List(Of Integer) = {1, 2, 3, 4, 5, 6, 7, 8, 9}&lt;/font&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;So you have to either add numbers to the list manually, or create an array, which still involves lots of tedious typing:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim numberList() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;With .NET 3.5, you can instead use the Range method of the Enumerable class that is part of the System.Linq namespace.&lt;/p&gt;  &lt;p&gt;In VB:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;Dim numberList2 As List(Of Integer) = Enumerable.Range(1, 9).ToList&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;In C#:&lt;/p&gt;  &lt;p&gt;&lt;font color="#65402e" face="Consolas"&gt;List&amp;lt;int&amp;gt; numberList2 = Enumerable.Range(1, 9).ToList();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The first parameter of the Range method defines the first integer of the sequence. The second parameter defines the number of items in the sequence. So Range(0,9) provides 9 integers from 0 through 8.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1697724" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/deborahk/archive/tags/VB/default.aspx">VB</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/CSharp/default.aspx">CSharp</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/deborahk/archive/tags/Generics/default.aspx">Generics</category></item></channel></rss>