Pour répondre à la question éditée: en bref, il est avantageux d'utiliser LINQ chaque fois que vous devez implémenter une fonctionnalité de "requête" (c'est ce que signifie le Q dans LINQ). La définition d'un domaine exact est difficile, mais elle simplifie considérablement une variété de tâches associées à l'extraction et à la manipulation de données à partir de collections.
Pour élaborer un peu, de nombreuses fonctionnalités de requête ont été introduites directement dans le langage (ou plutôt, les différents implémenteurs LINQ), donc des choses comme les agrégations, l'ordre, le regroupement, le filtrage, les projections, les jointures (et bien d'autres) sont toutes gérées pour vous. Les solutions basées sur LINQ sont également généralement beaucoup plus courtes que si vous les implémentiez "à la main", et communiquent également beaucoup mieux leur intention.
Un exemple simple qui aide souvent à transmettre la puissance de LINQ est d'afficher le contenu d'un répertoire, groupé par extension. Exécutez une mise en œuvre impérative typique dans votre tête - il y aura déjà beaucoup de détails de mise en œuvre au début. Peut-être utiliserons-nous un Dictionary<String, List<String>>
pour indexer les fichiers par extension. Bien sûr, nous devrons vérifier si une clé existe déjà, instancier une liste, y ajouter, etc. Cela pourrait aller quelque chose comme:
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);
}
Considérez l'équivalent LINQ:
var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
group file by Path.GetExtension(file).ToLower();
Notez que la requête elle-même n'est que de 2 lignes, certainement plus courte que toute solution impérative que nous aurions pu trouver. Il est également assez lisible; le rapport signal / bruit est plus élevé qu'il ne l'était avec la première solution. Pour ceux qui sont nouveaux dans LINQ, vous devez générer les résultats de cette requête comme suit:
foreach (var fileGroup in query)
{
Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));
foreach (string file in fileGroup)
{
Console.WriteLine(file);
}
}
Avec des exemples plus complexes, les différences deviennent normalement encore plus importantes (envisagez simplement le regroupement par plusieurs champs, par exemple). Donc, pour résumer, LINQ résout de nombreux problèmes d'interrogation de données "au jour le jour" d'une manière qui est souvent plus courte et plus auto-descriptive. Cela vient à un faible coût d'avoir à apprendre la syntaxe et la technologie, mais les avantages l'emportent largement sur les négatifs.