Aby odpowiedzieć na edytowane pytanie: krótko mówiąc, warto skorzystać z LINQ, ilekroć trzeba zaimplementować funkcję „zapytania” (to właśnie oznacza Q w LINQ). Określenie dokładnej domeny jest trudne, ale znacznie upraszcza różnorodne zadania związane z wyodrębnianiem i manipulowaniem danymi z kolekcji.
Aby nieco rozwinąć, wiele funkcji zapytań zostało wprowadzonych bezpośrednio do języka (a raczej różnych implementatorów LINQ), więc rzeczy takie jak agregacje, porządkowanie, grupowanie, filtrowanie, projekcje, łączenia (i wiele innych) są obsługiwane dla ty. Rozwiązania oparte na LINQ są również zwykle znacznie krótsze niż gdybyś wdrożył je „ręcznie”, a także znacznie lepiej zakomunikował swoje zamiary.
Prostym przykładem, który często pomaga przekazać moc LINQ, jest wyświetlenie zawartości katalogu pogrupowanego według rozszerzeń. Przeprowadź typową implementację imperatywną w swojej głowie - na początku będzie wiele szczegółów implementacji. Być może użyjemy a Dictionary<String, List<String>>
do indeksowania plików według rozszerzenia. Oczywiście będziemy musieli sprawdzić, czy klucz już istnieje, utworzyć instancję listy, dodać do niej itp. Może to wyglądać następująco:
Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();
foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
string extension = Path.GetExtension(file).ToLower();
if (!fileGroups.ContainsKey(extension))
{
fileGroups[extension] = new List<string>();
}
fileGroups[extension].Add(file);
}
Rozważ odpowiednik LINQ:
var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
group file by Path.GetExtension(file).ToLower();
Zauważ, że samo zapytanie ma tylko 2 wiersze, z pewnością krótsze niż jakiekolwiek bezwzględnie konieczne rozwiązanie. Jest również dość czytelny; stosunek sygnału do szumu jest wyższy niż w pierwszym rozwiązaniu. W przypadku nowych użytkowników LINQ wyniki tego zapytania byłyby wyświetlane w następujący sposób:
foreach (var fileGroup in query)
{
Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));
foreach (string file in fileGroup)
{
Console.WriteLine(file);
}
}
W przypadku bardziej złożonych przykładów różnice zwykle stają się jeszcze większe (na przykład po prostu pogrupuj według wielu pól). Podsumowując, LINQ rozwiązuje wiele codziennych problemów z kwerendami danych w sposób, który jest często krótszy i bardziej opisowy. To wymaga niewielkiego kosztu nauki składni i technologii, ale korzyści znacznie przewyższają negatywne.