var wordsA = new string[] { \ var wordsB = new string[] { \ bool match = wordsA.EqualAll(wordsB);
Console.WriteLine(\}
EqualAll - 2
public void Linq97() {
var wordsA = new string[] { \ var wordsB = new string[] { \ bool match = wordsA.EqualAll(wordsB);
Console.WriteLine(\}
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(\ }
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(\ } }
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(\ }
}
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(\ 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(\ foreach (int n in lowNumbers) {
Console.WriteLine(n); } }