Linq is op zijn beurt weer niet heel veel meer dan syntactic sugar voor ouwerwetse for-loopjes. Als je moeite hebt met de linq expressies dan raad ik je aan ze gewoon uit te schrijven in for...-vorm. Linq leest wel fijn en is echt wel handig als je 't een beetje beheerst, maar het is geen silver bullet
Kort (en daarom misschien niet 100% accuraat maar wel begrijpbaar): Linq werkt op sets (IEnumerables to be precise) en voegt gewoon een zooi extension methods toe. Als je <array>.Where(...) doet of <list>.Where(...) doet gaat Linq gewoon voor je over die array/list heen lopen. Wat concreter:
C#:
1
2
| var numbers = new int[] { 1, 2, 15, 17, 20 };
var evens = numbers.Where(n => n % 2 == 0); |
n => kun je lezen als "n goes into" ofwel: de where schopt voor elk item in de lijst de expressie (n %2 == 0) een keer aan waarbij de n een item uit de lijst is. Je had natuurlijk ook x of MyNumber kunnen schrijven. Vervolgens verwacht de .Where() method een predicate; ofwel: iets dat een bool returned (dus: true == match predicate, false == geen match op predicate). Het result van de where is vervolgens weer een nieuwe IEnumerable (van hetzelfde type als je erin stopte) waarbij enkel de items overblijven die de predicate matchten.
Zonder linq te gebruiken is dit ongeveer wat er gebeurt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
var numbers = new int[] { 1, 2, 15, 17, 20 };
var evens = numbers.MyWhere(n => n % 2 == 0);
var large = numbers.MyWhere(x => x >= 10);
var all = numbers.MyWhere(n => true);
Console.WriteLine("Evens: {0}", string.Join(",", evens));
Console.WriteLine("Large: {0}", string.Join(",", large));
Console.WriteLine("All : {0}", string.Join(",", all));
}
}
public static class MyLinq
{
public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> items, Func<T, bool> predicate)
{
foreach (var i in items)
if (predicate(i))
yield return i;
}
} |
Stap daar maar eens met je debugger doorheen; dan gaan er geheid een boel lampjes branden

Note ook dat de MyWhere weer een IEnumerable returned dus er is niets wat je let om een
items.MyWhere(...).MyWhere(...).MyWhere(...) te doen (hoewel dat niet erg efficiënt is en je waarschijnlijk beter in je expression wat kunt &&'en en ||'en

).
Linq biedt een
crapton aan extensionmethods (en dan hebben we 't nog niet gehad over IQueryables, deferred execution enzovoorts en
yield waar linq zwaar op leunt) maar het loont zich zéker het te leren of je er in ieder geval in te verdiepen.
[
Voor 85% gewijzigd door
RobIII op 03-12-2015 11:44
]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij