52 votes

Puis-je déclarer / utiliser une variable dans LINQ? Ou puis-je écrire après LINQ plus clair?

Puis-je déclarer / utiliser une variable dans LINQ ?

Par exemple, puis-je écrire après LINQ plus clair?

 var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
        where (t.ComponentType.GetProperty(t.Name) != null)
        select t.ComponentType.GetProperty(t.Name);
 

Existe-t-il un moyen de ne pas écrire / appeler t.ComponentType.GetProperty(t.Name) deux fois ici?

85voto

It'sNotALie. Points 10674

Vous avez besoin de let :

 var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
        let name = t.ComponentType.GetProperty(t.Name)
        where (name != null)
        select name;
 

Si vous voulez le faire en syntaxe de requête, vous pouvez le faire de manière plus efficace (autant que possible) et plus propre:

 var q = TypeDescriptor
            .GetProperties(instance)
            .Select(t => t.ComponentType.GetProperty(t.Name))
            .Where(name => name != null);
 

79voto

King King Points 30608
var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
        let u = t.ComponentType.GetProperty(t.Name)
        where (u != null)
        select u;

14voto

Matten Points 9394

Oui, en utilisant le mot clé let :

 var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
    let nameProperty = t.ComponentType.GetProperty(t.Name)
    where (nameProperty != null)
    select nameProperty;
 

7voto

usr Points 74796

Il existe une alternative que peu de gens connaissent ( select a into b ):

 var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
        select t.ComponentType.GetProperty(t.Name) into u
        where u != null
        select u;
 

Cela se traduit par:

 var q = TypeDescriptor.GetProperties(instance)
        .Select(t => t.ComponentType.GetProperty(t.Name))
        .Where(prop => prop != null);
 

Attendu que la version basée sur let traduit par:

 var q = TypeDescriptor.GetProperties(instance)
        .Select(t => new { t, prop = t.ComponentType.GetProperty(t.Name) })
        .Where(x => x.prop != null)
        .Select(x => x.prop);
 

Allocation inutile par article car t est toujours dans la portée (mais pas encore utilisé). Le compilateur C # devrait juste optimiser cela, mais pas (ou la spécification du langage ne le permet pas, pas sûr).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X