101个LINQ示例,包含几乎全部操作

Restriction Operators  
Where - Simple 1  
public void Linq1() {  
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
    var lowNums =  
        from n in numbers  
        where n < 5  
        select n;  
    Console.WriteLine("Numbers < 5:");  
    foreach (var x in lowNums) {  
        Console.WriteLine(x);  
    }  
}  
  
Where - Simple 2  
public void Linq2() {  
    List products = GetProductList();  
    var soldOutProducts =  
        from p in products  
        where p.UnitsInStock == 0  
        select p;  
    Console.WriteLine("Sold out products:");  
    foreach (var product in soldOutProducts) {  
        Console.WriteLine("{0} is sold out!", product.ProductName);  
    }  
}  
  
Where - Simple 3  
public void Linq3() {  
    List products = GetProductList();  
    var expensiveInStockProducts =  
        from p in products  
        where p.UnitsInStock > 0 && p.UnitPrice > 3.00M  
        select p;  
    Console.WriteLine("In-stock products that cost more than 3.00:");  
    foreach (var product in expensiveInStockProducts) {  
        Console.WriteLine("{0} is in stock and costs more than 3.00.", product.ProductName);  
    }  
}  
  
Where - Drilldown  
public void Linq4() {  
    List customers = GetCustomerList();  
    var waCustomers =  
        from c in customers  
        where c.Region == "WA"  
        select c;  
    Console.WriteLine("Customers from Washington and their orders:");  
    foreach (var customer in waCustomers) {  
        Console.WriteLine("Customer {0}: {1}", customer.CustomerID, customer.CompanyName);  
        foreach (var order in customer.Orders) {  
            Console.WriteLine(" Order {0}: {1}", order.OrderID, order.OrderDate);  
        }  
    }  
}  
  
Where - Indexed  
public void Linq5() {  
    string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };  
    var shortDigits = digits.Where((digit, index) => digit.Length < index);  
    Console.WriteLine("Short digits:");  
    foreach (var d in shortDigits) {  
        Console.WriteLine("The word {0} is shorter than its value.", d);  
    }  
}  
  
Projection Operators  
Select - Simple 1  
public void Linq6() {  
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
    var numsPlusOne =  
        from n in numbers  
        select n + 1;  
    Console.WriteLine("Numbers + 1:");  
    foreach (var i in numsPlusOne) {  
        Console.WriteLine(i);  
    }  
}  
  
Select - Simple 2  
public void Linq7() {  
    List products = GetProductList();  
    var productNames =  
        from p in products  
        select p.ProductName;  
    Console.WriteLine("Product Names:");  
    foreach (var productName in productNames) {  
        Console.WriteLine(productName);  
    }  
}  
  
Select - Transformation  
public void Linq8() {  
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
    string[] strings = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };  
    var textNums =   
        from n in numbers  
        select strings[n];  
    Console.WriteLine("Number strings:");  
    foreach (var s in textNums) {  
        Console.WriteLine(s);  
    }           
}  
  
Select - Anonymous Types 1  
public void Linq9() {  
    string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };  
    var upperLowerWords =  
        from w in words  
        select new {Upper = w.ToUpper(), Lower = w.ToLower()};  
    foreach (var ul in upperLowerWords) {  
        Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);  
    }  
}  
  
Select - Anonymous Types 2  
public void Linq10() {  
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
    string[] strings = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };  
    var digitOddEvens =  
        from n in numbers  
        select new {Digit = strings[n], Even = (n % 2 == 0)};  
    foreach (var d in digitOddEvens) {  
        Console.WriteLine("The digit {0} is {1}.", d.Digit, d.Even ? "even" : "odd");  
    }  
}  
  
Select - Anonymous Types 3  
public void Linq11() {  
    List products = GetProductList();  
    var productInfos =  
        from p in products  
        select new {p.ProductName, p.Category, Price = p.UnitPrice};  
    Console.WriteLine("Product Info:");  
    foreach (var productInfo in productInfos) {  
        Console.WriteLine("{0} is in the category {1} and costs {2} per unit.", productInfo.ProductName, productInfo.Category, productInfo.Price);  
    }  
}  
  
Select - Indexed  
public void Linq12() {  
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
    var numsInPlace = numbers.Select((num, index) => new {Num = num, InPlace = (num == index)});  
    Console.WriteLine("Number: In-place?");  
    foreach (var n in numsInPlace) {  
        Console.WriteLine("{0}: {1}", n.Num, n.InPlace);  
    }  
}  
  
Select - Filtered  
public void Linq13() {  
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
    string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };  
    var lowNums =  
        from n in numbers  
        where n < 5  
        select digits[n];  
    Console.WriteLine("Numbers < 5:");  
    foreach (var num in lowNums) {  
        Console.WriteLine(num);  
    }       
}  
  
SelectMany - Compound from 1  
public void Linq14() {  
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };  
    int[] numbersB = { 1, 3, 5, 7, 8 };  
    var pairs =  
        from a in numbersA,  
                b in numbersB  
        where a < b  
        select new {a, b};  
    Console.WriteLine("Pairs where a < b:");  
    foreach (var pair in pairs) {  
        Console.WriteLine("{0} is less than {1}", pair.a, pair.b);  
    }  
}  
  
SelectMany - Compound from 2  
public void Linq15() {  
    List customers = GetCustomerList();  
    var orders =  
        from c in customers,  
                o in c.Orders  
        where o.Total < 500.00M  
        select new {c.CustomerID, o.OrderID, o.Total};  
    ObjectDumper.Write(orders);  
}  
  
SelectMany - Compound from 3  
public void Linq16() {  
    List customers = GetCustomerList();  
    var orders =  
        from c in customers,  
                o in c.Orders  
        where o.OrderDate >= new DateTime(1998, 1, 1)  
        select new {c.CustomerID, o.OrderID, o.OrderDate};  
    ObjectDumper.Write(orders);  
}  
  
SelectMany - from Assignment  
public void Linq17() {  
    List customers = GetCustomerList();  
    var orders =  
        from c in customers,  
                o in c.Orders,  
                total = o.Total  
        where total >= 2000.0M  
        select new {c.CustomerID, o.OrderID, total};  
    ObjectDumper.Write(orders);  
}  
  
SelectMany - Multiple from  
public void Linq18() {  
    List customers = GetCustomerList();  
    DateTime cutoffDate = new DateTime(1997, 1, 1);  
    var orders =  
        from c in customers  
        where c.Region == "WA"  
        from o in c.Orders  
        where o.OrderDate >= cutoffDate  
        select new {c.CustomerID, o.OrderID};  
    ObjectDumper.Write(orders);  
}  
  
SelectMany - Indexed  
public void Linq19() {  
    List customers = GetCustomerList();  
    var customerOrders =  
        customers.SelectMany(  
            (cust, custIndex) =>  
            cust.Orders.Select(o => "Customer #" + (custIndex + 1) +  
                                    " has an order with OrderID " + o.OrderID) );  
    ObjectDumper.Write(customerOrders);  
}  
  
Partitioning Operators  
Take - Simple  
public void Linq20() {  
            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
            var first3Numbers = numbers.Take(3);  
            Console.WriteLine("First 3 numbers:");  
            foreach (var n in first3Numbers) {  
                Console.WriteLine(n);  
            }  
        }  
  
Take - Nested  
public void Linq21() {  
            List<Customer> customers = GetCustomerList();  
            var first3WAOrders = (  
                from c in customers  
                from o in c.Orders  
                where c.Region == "WA"  
                select new {c.CustomerID, o.OrderID, o.OrderDate} )  
                .Take(3);  
            Console.WriteLine("First 3 orders in WA:");  
            foreach (var order in first3WAOrders) {  
                ObjectDumper.Write(order);  
            }  
        }  
  
Skip - Simple  
public void Linq22() {  
            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
            var allButFirst4Numbers = numbers.Skip(4);  
            Console.WriteLine("All but first 4 numbers:");  
            foreach (var n in allButFirst4Numbers) {  
                Console.WriteLine(n);  
            }  
        }  
  
Skip - Nested  
public void Linq23() {  
            List<Customer> customers = GetCustomerList();  
            var waOrders =  
                from c in customers  
                from o in c.Orders  
                where c.Region == "WA"  
                select new {c.CustomerID, o.OrderID, o.OrderDate};  
            var allButFirst2Orders = waOrders.Skip(2);  
            Console.WriteLine("All but first 2 orders in WA:");  
            foreach (var order in allButFirst2Orders) {  
                ObjectDumper.Write(order);  
            }  
        }  
  
TakeWhile - Simple  
public void Linq24() {  
            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
            var firstNumbersLessThan6 = numbers.TakeWhile(n => n < 6);  
            Console.WriteLine("First numbers less than 6:");  
            foreach (var n in firstNumbersLessThan6) {  
                Console.WriteLine(n);  
            }  
        }  
  
SkipWhile - Simple  
public void Linq26() {  
            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
            var allButFirst3Numbers = numbers.SkipWhile(n => n % 3 != 0);  
            Console.WriteLine("All elements starting from first element divisible by 3:");  
            foreach (var n in allButFirst3Numbers) {  
                Console.WriteLine(n);  
            }  
        }  
  
SkipWhile - Indexed  
public void Linq27() {  
            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
            var laterNumbers = numbers.SkipWhile((n, index) => n >= index);  
            Console.WriteLine("All elements starting from first element less than its position:");  
            foreach (var n in laterNumbers) {  
                Console.WriteLine(n);  
            }  
        }  
  
Ordering Operators  
OrderBy - Simple 1  
publicvoid Linq28() {  
    string[] words = { "cherry", "apple", "blueberry" };  
      
    var sortedWords =  
        from w in words  
        orderby w  
        select w;  
      
    Console.WriteLine("The sorted list of words:");  
    foreach (var w in sortedWords) {  
        Console.WriteLine(w);  
    }  
}  
OrderBy - Simple 2  
public void Linq29() {  
    string[] words = { "cherry", "apple", "blueberry" };  
    var sortedWords =  
        from w in words  
        orderby w.Length  
        select w;  
    Console.WriteLine("The sorted list of words (by length):");  
    foreach (var w in sortedWords) {  
        Console.WriteLine(w);  
    }  
}  
  
OrderBy - Simple 3  
public void Linq30() {  
    List products = GetProductList();  
    var sortedProducts =  
        from p in products  
        orderby p.ProductName  
        select p;  
    ObjectDumper.Write(sortedProducts);  
}  
  
OrderBy - Comparer  
public class CaseInsensitiveComparer : IComparer<string>  
{  
    public int Compare(string x, string y)  
    {  
        return string.Compare(x, y, true);  
    }  
}  
public void Linq31() {  
    string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry"};  
    var sortedWords = words.OrderBy(a => a, new CaseInsensitiveComparer());  
    ObjectDumper.Write(sortedWords);  
}  
  
OrderByDescending - Simple 1  
public void Linq32() {  
    double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };  
    var sortedDoubles =  
        from d in doubles  
        orderby d descending  
        select d;  
    Console.WriteLine("The doubles from highest to lowest:");  
    foreach (var d in sortedDoubles) {  
        Console.WriteLine(d);  
    }  
}  
  
OrderByDescending - Simple 2  
public void Linq33() {  
    List products = GetProductList();  
    var sortedProducts =  
        from p in products  
        orderby p.UnitsInStock descending  
        select p;  
    ObjectDumper.Write(sortedProducts);  
}  
  
OrderByDescending - Comparer  
public class CaseInsensitiveComparer : IComparerspan class="qs-keyword">string>  
{  
    publicint Compare(string x, string y)  
    {  
        returnstring.Compare(x, y, true);  
    }  
}  
  
publicvoid Linq34() {  
    string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry"};  
      
    var sortedWords = words.OrderByDescending(a => a, new CaseInsensitiveComparer());  
          
    ObjectDumper.Write(sortedWords);  
}  
ThenBy - Simple  
publicvoid Linq35() {  
    string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };  
  
    var sortedDigits =  
        from d in digits   
        orderby d.Length, d  
        select d;  
  
    Console.WriteLine("Sorted digits:");  
    foreach (var d in sortedDigits) {  
        Console.WriteLine(d);  
    }  
}  
ThenBy - Comparer  
public class CaseInsensitiveComparer : IComparerspan class="qs-keyword">string>  
{  
    publicint Compare(string x, string y)  
    {  
        returnstring.Compare(x, y, true);  
    }  
}  
  
publicvoid Linq36() {  
    string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry"};  
      
    var sortedWords =  
        words.OrderBy(a => a.Length)  
                .ThenBy(a => a, new CaseInsensitiveComparer());  
          
    ObjectDumper.Write(sortedWords);  
}  
ThenByDescending - Simple  
publicvoid Linq37() {  
    List products = GetProductList();var sortedProducts =  
        from p in products  
        orderby p.Category, p.UnitPrice descendingselect p;  
  
    ObjectDumper.Write(sortedProducts);  
}  
ThenByDescending - Comparer  
public class CaseInsensitiveComparer : IComparerspan class="qs-keyword">string>  
{  
    publicint Compare(string x, string y)  
    {  
        returnstring.Compare(x, y, true);  
    }  
}  
  
publicvoid Linq38() {  
    string[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry"};  
      
    var sortedWords =  
        words.OrderBy(a => a.Length)  
                .ThenByDescending(a => a, new CaseInsensitiveComparer());  
          
    ObjectDumper.Write(sortedWords);  
}  
Reverse  
publicvoid Linq39() {  
    string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };  
      
    var reversedIDigits = (  
        from d in digits  
        where d[1] == 'i'  
        select d)  
        .Reverse();  
      
    Console.WriteLine("A backwards list of the digits with a second character of 'i':");  
    foreach (var d in reversedIDigits) {  
        Console.WriteLine(d);  
    }               
}  
Grouping Operators  
GroupBy - Simple 1  
public void Linq40() {  
            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
            var numberGroups =  
                from n in numbers  
                group n by n % 5 into g  
                select new { Remainder = g.Key, Numbers = g };  
            foreach (var g in numberGroups) {  
                Console.WriteLine("Numbers with a remainder of {0} when divided by 5:", g.Remainder);  
                foreach (var n in g.Numbers) {  
                    Console.WriteLine(n);  
                }  
            }  
}  
  
GroupBy - Simple 2  
public void Linq41() {  
            string[] words = { "blueberry", "chimpanzee", "abacus", "banana", "apple", "cheese" };  
            var wordGroups =  
                from w in words  
                group w by w[0] into g  
                select new { FirstLetter = g.Key, Words = g };  
            foreach (var g in wordGroups) {  
                Console.WriteLine("Words that start with the letter '{0}':", g.FirstLetter);  
                foreach (var w in g.Words) {  
                    Console.WriteLine(w);  
                }  
            }  
        }  
  
GroupBy - Simple 3  
public void Linq42() {  
            List<Product> products = GetProductList();  
            var orderGroups =  
                from p in products  
                group p by p.Category into g  
                select new { Category = g.Key, Products = g };  
            ObjectDumper.Write(orderGroups, 1);  
        }  
  
GroupBy - Nested  
public void Linq43() {  
            List<Customer> customers = GetCustomerList();  
            var customerOrderGroups =   
                from c in customers  
                select  
                    new {c.CompanyName,   
                         YearGroups =  
                             from o in c.Orders  
                             group o by o.OrderDate.Year into yg  
                             select  
                                 new {Year = yg.Key,  
                                      MonthGroups =   
                                          from o in yg  
                                          group o by o.OrderDate.Month into mg  
                                          select new { Month = mg.Key, Orders = mg }  
                                     }  
                        };  
            ObjectDumper.Write(customerOrderGroups, 3);  
        }  
  
GroupBy - Comparer  
public class AnagramEqualityComparer : IEqualityComparer   
{   
public bool Equals(string x, string y) { return getCanonicalString(x) == getCanonicalString(y); }   
public int GetHashCode(string obj) { return getCanonicalString(obj).GetHashCode(); }   
private string getCanonicalString(string word)   
{   
    char[] wordChars = word.ToCharArray(); Array.Sort(wordChars); return new string(wordChars);   
}   
}   
  
  
publicvoid Linq44()   
{   
string[] anagrams = {"from ", " salt", " earn ", " last ", " near ", " form "};   
var orderGroups = anagrams.GroupBy(w => w.Trim(), new AnagramEqualityComparer());   
ObjectDumper.Write(orderGroups, 1);   
}  
GroupBy - Comparer, Mapped  
public void Linq45() {  
            string[] anagrams = {"from ", " salt", " earn ", " last ", " near ", " form "};  
            var orderGroups = anagrams.GroupBy(  
                        w => w.Trim(),   
                        a => a.ToUpper(),  
                        new AnagramEqualityComparer()  
                        );  
            ObjectDumper.Write(orderGroups, 1);  
        }  
public class AnagramEqualityComparer : IEqualityComparer<string>  
        {  
            public bool Equals(string x, string y) {  
                return getCanonicalString(x) == getCanonicalString(y);  
            }  
            public int GetHashCode(string obj) {  
                return getCanonicalString(obj).GetHashCode();  
            }  
            private string getCanonicalString(string word) {  
                char[] wordChars = word.ToCharArray();  
                Array.Sort<char>(wordChars);  
                return new string(wordChars);  
            }  
        }  
  
Set Operators  
Distinct - 1  
publicvoid Linq46() {  
    int[] factorsOf300 = { 2, 2, 3, 5, 5 };  
      
    var uniqueFactors = factorsOf300.Distinct();  
  
    Console.WriteLine("Prime factors of 300:");  
    foreach (var f in uniqueFactors) {  
        Console.WriteLine(f);  
    }  
}  
Distinct - 2  
public void Linq47() {  
    List products = GetProductList();  
    var categoryNames = (  
        from p in products  
        select p.Category)  
        .Distinct();  
                                              
    Console.WriteLine("Category names:");  
    foreach (var n in categoryNames) {  
        Console.WriteLine(n);  
    }  
}  
Union - 1  
publicvoid Linq48() {  
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };  
    int[] numbersB = { 1, 3, 5, 7, 8 };  
      
    var uniqueNumbers = numbersA.Union(numbersB);  
      
    Console.WriteLine("Unique numbers from both arrays:");  
    foreach (var n in uniqueNumbers) {  
        Console.WriteLine(n);  
    }  
}  
Union - 2  
publicvoid Linq49() {  
    List products = GetProductList();List customers = GetCustomerList();  
      
    var productFirstChars =  
        from p in products  
        select p.ProductName[0];  
    var customerFirstChars =  
        from c in customers  
        select c.CompanyName[0];  
      
    var uniqueFirstChars = productFirstChars.Union(customerFirstChars);  
      
    Console.WriteLine("Unique first letters from Product names and Customer names:");  
    foreach (var ch in uniqueFirstChars) {  
        Console.WriteLine(ch);  
    }  
}  
Intersect - 1  
publicvoid Linq50() {  
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };  
    int[] numbersB = { 1, 3, 5, 7, 8 };  
      
    var commonNumbers = numbersA.Intersect(numbersB);  
      
    Console.WriteLine("Common numbers shared by both arrays:");  
    foreach (var n in commonNumbers) {  
        Console.WriteLine(n);  
    }  
}  
Intersect - 2  
publicvoid Linq51() {  
    List products = GetProductList();  
    List customers = GetCustomerList();  
      
    var productFirstChars =  
        from p in products  
        select p.ProductName[0];  
    var customerFirstChars =  
        from c in customers  
        select c.CompanyName[0];  
      
    var commonFirstChars = productFirstChars.Intersect(customerFirstChars);  
      
    Console.WriteLine("Common first letters from Product names and Customer names:");  
    foreach (var ch in commonFirstChars) {  
        Console.WriteLine(ch);  
    }  
}  
Except - 1  
public void Linq52() {  
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };  
    int[] numbersB = { 1, 3, 5, 7, 8 };  
    IEnumerable<int> aOnlyNumbers = numbersA.Except(numbersB);  
    Console.WriteLine("Numbers in first array but not second array:");  
    foreach (var n in aOnlyNumbers) {  
        Console.WriteLine(n);  
    }  
}  
  
Except - 2  
public void Linq53() {  
    List products = GetProductList();  
    List customers = GetCustomerList();  
    var productFirstChars =  
        from p in products  
        select p.ProductName[0];  
    var customerFirstChars =  
        from c in customers  
        select c.CompanyName[0];  
    var productOnlyFirstChars = productFirstChars.Except(customerFirstChars);  
    Console.WriteLine("First letters from Product names, but not from Customer names:");  
    foreach (var ch in productOnlyFirstChars) {  
        Console.WriteLine(ch);  
    }  
}  
  
Conversion Operators  
To Array  
public void Linq54() {  
    double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };  
    var sortedDoubles =  
        from d in doubles  
        orderby d descending  
        select d;  
    var doublesArray = sortedDoubles.ToArray();  
    Console.WriteLine("Every other double from highest to lowest:");  
    for (int d = 0; d < doublesArray.Length; d += 2) {  
        Console.WriteLine(doublesArray[d]);  
    }   
}  
  
To List  
public void Linq55() {  
    string[] words = { "cherry", "apple", "blueberry" };  
    var sortedWords =  
        from w in words  
        orderby w  
        select w;  
    var wordList = sortedWords.ToList();  
    Console.WriteLine("The sorted word list:");  
    foreach (var w in wordList) {  
        Console.WriteLine(w);  
    }  
}  
  
To Dictionary  
public void Linq56() {  
    var scoreRecords = new [] { new {Name = "Alice", Score = 50},  
                                new {Name = "Bob" , Score = 40},  
                                new {Name = "Cathy", Score = 45}  
                              };  
    var scoreRecordsDict = scoreRecords.ToDictionary(sr => sr.Name);  
    Console.WriteLine("Bob's score: {0}", scoreRecordsDict["Bob"]);  
}  
  
OfType  
public void Linq57() {  
    object[] numbers = { null, 1.0, "two", 3, 4.0f, 5, "six", 7.0 };  
    var doubles = numbers.OfType<double>();  
    Console.WriteLine("Numbers stored as doubles:");  
    foreach (var d in doubles) {  
        Console.WriteLine(d);  
    }  
}  
  
Element Operators  
First - Simple  
public void Linq58() {  
    List products = GetProductList();  
    Product product12 = (  
        from p in products  
        where p.ProductID == 12  
        select p )  
        .First();  
    ObjectDumper.Write(product12);  
}  
  
First - Indexed  
public void Linq60() {  
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
    int evenNum = numbers.First((num, index) => (num % 2 == 0) && (index % 2 == 0));  
    Console.WriteLine("{0} is an even number at an even position within the list.", evenNum);  
}  
  
FirstOrDefault - Simple  
public void Linq61() {  
    int[] numbers = {};  
    int firstNumOrDefault = numbers.FirstOrDefault();  
    Console.WriteLine(firstNumOrDefault);  
}  
  
FirstOrDefault - Condition  
public void Linq62() {  
    List products = GetProductList();  
    Product product789 = products.FirstOrDefault(p => p.ProductID == 789);  
    Console.WriteLine("Product 789 exists: {0}", product789 != null);  
}  
  
FirstOrDefault - Indexed  
public void Linq63() {  
    double?[] doubles = { 1.7, 2.3, 4.1, 1.9, 2.9 };  
    double? num = doubles.FirstOrDefault((n, index) => (n >= index - 0.5 && n <= index + 0.5));  
    if (num != null)  
        Console.WriteLine("The value {1} is within 0.5 of its index position.", num);  
    else  
        Console.WriteLine("There is no number within 0.5 of its index position.", num);  
}  
  
ElementAt  
public void Linq64() {  
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
    int fourthLowNum = (  
        from n in numbers  
        where n < 5  
        select n )  
        .ElementAt(3); // 3 because sequences use 0-based indexing  
    Console.WriteLine("Fourth number < 5: {0}", fourthLowNum);  
}  
  
Generation Operators  
Range  
public void Linq65() {   
   var numbers =   
      from n in Sequence.Range(100, 50)   
      selectnew {Number = n, OddEven = n % 2 == 1 ? "odd" : "even"};   
   foreach (var n in numbers) {   
      Console.WriteLine("The number {0} is {1}.", n.Number, n.OddEven);   
   }   
}  
  
Repeat  
public void Linq66() {   
   var numbers = Sequence.Repeat(7, 10);   
   foreach (var n in numbers) {   
      Console.WriteLine(n);   
   }   
}  
  
Quantifiers  
Any - Simple  
public void Linq67() {   
   string[] words = { "believe", "relief", "receipt", "field" };   
   bool iAfterE = words.Any(w => w.Contains("ei"));   
   Console.WriteLine("There is a word that contains in the list that contains 'ei': {0}", iAfterE);   
}  
  
Any - Indexed  
public void Linq68() {   
   int[] numbers = { -9, -4, -8, -3, -5, -2, -1, -6, -7 };   
   bool negativeMatch = numbers.Any((n, index) => n == -index);   
   Console.WriteLine("There is a number that is the negative of its index: {0}", negativeMatch);   
}  
  
Any - Grouped  
public void Linq69() {   
   List products = GetProductList();  
   var productGroups =   
      from p in products   
      group p by p.Category into g   
      where g.Group.Any(p => p.UnitsInStock == 0)   
      select new {Category = g.Key, Products = g.Group};   
   ObjectDumper.Write(productGroups, 1);   
}  
  
All - Simple  
public void Linq70() {   
   int[] numbers = { 1, 11, 3, 19, 41, 65, 19 };  
   bool onlyOdd = numbers.All(n => n % 2 == 1);  
   Console.WriteLine("The list contains only odd numbers: {0}", onlyOdd);   
}  
  
All - Indexed  
public void Linq71() {   
   int[] lowNumbers = { 1, 11, 3, 19, 41, 65, 19 };   
   int[] highNumbers = { 7, 19, 42, 22, 45, 79, 24 };   
   bool allLower = lowNumbers.All((num, index) => num < highNumbers[index]);   
   Console.WriteLine("Each number in the first list is lower than its counterpart in the second list: {0}", allLower);   
}  
  
All - Grouped  
public void Linq72() {   
   List products = GetProductList();  
   var productGroups =   
      from p in products   
      group p by p.Category into g   
      where g.Group.All(p => p.UnitsInStock > 0)   
      select new {Category = g.Key, Products = g.Group};   
   ObjectDumper.Write(productGroups, 1);   
}  
  
Aggregate Operators  
Count - Simple  
public void Linq73() {   
   int[] factorsOf300 = { 2, 2, 3, 5, 5 };   
   int uniqueFactors = factorsOf300.Distinct().Count();   
   Console.WriteLine("There are {0} unique factors of 300.", uniqueFactors);   
}  
  
Count - Conditional  
public void Linq74() {   
   int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };   
   int oddNumbers = numbers.Count(n => n % 2 == 1);   
   Console.WriteLine("There are {0} odd numbers in the list.", oddNumbers);   
}  
  
Count - Indexed  
public void Linq75() {   
   int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
   int oddEvenMatches = numbers.Count((n, index) => n % 2 == index % 2);  
   Console.WriteLine("There are {0} numbers in the list whose odd/even status " +   
        "matches that of their position.", oddEvenMatches);   
}  
  
Count - Nested  
public void Linq76() {   
   List customers = GetCustomerList();  
   var orderCounts =   
      from c in customers   
      select new {c.CustomerID, OrderCount = c.Orders.Count()};  
   ObjectDumper.Write(orderCounts);   
}  
  
Count - Grouped  
public void Linq77() {   
   List products = GetProductList();  
   var categoryCounts =   
      from p in products   
      group p by p.Category into g   
      select new {Category = g.Key, ProductCount = g.Group.Count()};  
   ObjectDumper.Write(categoryCounts);   
}  
  
Sum - Simple  
public void Linq78() {   
   int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };   
   double numSum = numbers.Sum();   
   Console.WriteLine("The sum of the numbers is {0}.", numSum);   
}  
  
Sum - Projection  
public void Linq79() {  
   string[] words = { "cherry", "apple", "blueberry" };  
   double totalChars = words.Sum(w => w.Length);  
   Console.WriteLine("There are a total of {0} characters in these words.", totalChars);   
}  
  
Sum - Grouped  
public void Linq80() {   
   List products = GetProductList();  
   var categories =   
      from p in products   
      group p by p.Category into g   
      select new {Category = g.Key, TotalUnitsInStock = g.Group.Sum(p => p.UnitsInStock)};   
   ObjectDumper.Write(categories);   
}  
  
Min - Simple  
public void Linq81() {   
   int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };   
   int minNum = numbers.Min();   
   Console.WriteLine("The minimum number is {0}.", minNum);   
}  
  
Min - Projection  
public void Linq82() {   
   string[] words = { "cherry", "apple", "blueberry" };   
   int shortestWord = words.Min(w => w.Length);   
   Console.WriteLine("The shortest word is {0} characters long.", shortestWord);   
}  
  
Min - Grouped  
public void Linq83() {   
   List products = GetProductList();  
   var categories =   
      from p in products   
      group p by p.Category into g   
      select new {Category = g.Key, CheapestPrice = g.Group.Min(p => p.UnitPrice)};   
   ObjectDumper.Write(categories);   
}  
  
Min - Elements  
public void Linq84() {   
   List products = GetProductList();  
   var categories =   
      from p in products   
      group p by p.Category into g   
      from minPrice = g.Group.Min(p => p.UnitPrice)   
      select new {Category = g.Key, CheapestProducts = g.Group.Where(p => p.UnitPrice == minPrice)};  
   ObjectDumper.Write(categories, 1);   
}  
  
Max - Simple  
public void Linq85() {   
   int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
   int maxNum = numbers.Max();   
   Console.WriteLine("The maximum number is {0}.", maxNum);   
}  
  
Max - Projection  
public void Linq86() {   
   string[] words = { "cherry", "apple", "blueberry" };   
   int longestLength = words.Max(w => w.Length);   
   Console.WriteLine("The longest word is {0} characters long.", longestLength);   
}  
  
Max - Grouped  
public void Linq87() {   
   List products = GetProductList();  
   var categories =   
      from p in products   
      group p by p.Category into g   
      select new {Category = g.Key, MostExpensivePrice = g.Group.Max(p => p.UnitPrice)};   
   ObjectDumper.Write(categories);   
}  
  
Max - Elements  
public void Linq88() {   
   List products = GetProductList();  
   var categories =   
      from p in products   
      group p by p.Category into g   
      from maxPrice = g.Group.Max(p => p.UnitPrice)   
      select new {Category = g.Key, MostExpensiveProducts = g.Group.Where(p => p.UnitPrice == maxPrice)};   
   ObjectDumper.Write(categories, 1);   
}  
  
Average - Simple  
public void Linq89() {   
   int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };   
   double averageNum = numbers.Average();   
   Console.WriteLine("The average number is {0}.", averageNum);   
}  
  
Average - Projection  
public void Linq90() {   
   string[] words = { "cherry", "apple", "blueberry" };   
   double averageLength = words.Average(w => w.Length);   
   Console.WriteLine("The average word length is {0} characters.", averageLength);   
}  
  
Average - Grouped  
public void Linq91() {   
   List products = GetProductList();  
   var categories =   
      from p in products   
      group p by p.Category into g   
      select new {Category = g.Key, AveragePrice = g.Group.Average(p => p.UnitPrice)};   
   ObjectDumper.Write(categories);   
}  
  
Fold - Simple  
public void Linq92() {   
   double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };   
   double product = doubles.Fold((runningProduct, nextFactor) => runningProduct * nextFactor);   
   Console.WriteLine("Total product of all numbers: {0}", product);   
}  
  
Fold - Seed  
public void Linq93() {   
   double startBalance = 100.0;   
   int[] attemptedWithdrawals = { 20, 10, 40, 50, 10, 70, 30 };   
   double endBalance =   
      attemptedWithdrawals.Fold(startBalance,   
         (balance, nextWithdrawal) =>   
            ( (nextWithdrawal <= balance) ? (balance - nextWithdrawal) : balance ) );   
   Console.WriteLine("Ending balance: {0}", endBalance);   
}  
  
Miscellaneous Operators  
Concat - 1  
public void Linq94() {  
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };  
    int[] numbersB = { 1, 3, 5, 7, 8 };  
    var allNumbers = numbersA.Concat(numbersB);  
    Console.WriteLine("All numbers from both arrays:");  
    foreach (var n in allNumbers) {  
        Console.WriteLine(n);  
    }  
}  
  
Concat - 2  
public void Linq95() {  
    List customers = GetCustomerList();  
    List products = GetProductList();  
    var customerNames =  
        from c in customers  
        select c.CompanyName;  
    var productNames =  
        from p in products  
        select p.ProductName;  
    var allNames = customerNames.Concat(productNames);  
    Console.WriteLine("Customer and product names:");  
    foreach (var n in allNames) {  
        Console.WriteLine(n);  
    }  
}  
  
EqualAll - 1  
public void Linq96() {  
    var wordsA = new string[] { "cherry", "apple", "blueberry" };  
    var wordsB = new string[] { "cherry", "apple", "blueberry" };  
    bool match = wordsA.EqualAll(wordsB);  
    Console.WriteLine("The sequences match: {0}", match);  
}  
  
EqualAll - 2  
public void Linq97() {  
    var wordsA = new string[] { "cherry", "apple", "blueberry" };  
    var wordsB = new string[] { "apple", "blueberry", "cherry" };  
    bool match = wordsA.EqualAll(wordsB);  
    Console.WriteLine("The sequences match: {0}", match);  
}  
  
Custom Sequence Operators  
Combine  
public static class CustomSequenceOperators  
{  
    public static IEnumerable Combine(this IEnumerable first, IEnumerable second, Func func) {  
        using (IEnumerator e1 = first.GetEnumerator(), e2 = second.GetEnumerator()) {  
            while (e1.MoveNext() && e2.MoveNext()) {  
                yield return func(e1.Current, e2.Current);  
            }  
        }  
    }  
}  
public void Linq98() {              
    int[] vectorA = { 0, 2, 4, 5, 6 };  
    int[] vectorB = { 1, 3, 5, 7, 8 };  
    int dotProduct = vectorA.Combine(vectorB, (a, b) => a * b).Sum();  
    Console.WriteLine("Dot product: {0}", dotProduct);  
}  
  
Query Execution  
Deferred  
public void Linq99() {  
    // Sequence operators form first-class queries that  
    // are not executed until you enumerate over them.  
    int[] numbers = new int[] { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
    int i = 0;  
    var q =  
        from n in numbers  
        select ++i;  
    // Note, the local variable 'i' is not incremented  
    // until each element is evaluated (as a side-effect):  
    foreach (var v in q) {  
        Console.WriteLine("v = {0}, i = {1}", v, i);           
    }   
}  
  
Immediate  
public void Linq100() {  
    // Methods like ToList() cause the query to be  
    // executed immediately, caching the results.  
    int[] numbers = new int[] { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };          
    int i = 0;  
    var q = (  
        from n in numbers  
        select ++i )  
        .ToList();  
    // The local variable i has already been fully  
    // incremented before we iterate the results:  
    foreach (var v in q) {  
        Console.WriteLine("v = {0}, i = {1}", v, i);  
    }   
}  
  
Query Reuse  
public void Linq101() {  
    // Deferred execution lets us define a query once  
    // and then reuse it later after data changes.  
    int[] numbers = new int[] { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
    var lowNumbers =  
        from n in numbers  
        where n <= 3  
        select n;  
    Console.WriteLine("First run numbers <= 3:");  
    foreach (int n in lowNumbers) {  
        Console.WriteLine(n);  
    }  
    for (int i = 0; i < 10; i++) {  
        numbers[i] = -numbers[i];  
    }  
    // During this second run, the same query object,  
    // lowNumbers, will be iterating over the new state  
    // of numbers[], producing different results:  
    Console.WriteLine("Second run numbers <= 3:");  
    foreach (int n in lowNumbers) {  
        Console.WriteLine(n);  
    }  
}  

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值