Puis-je déclarer / utiliser des variables dans LINQ ?
Par exemple, puis-je écrire après LINQ clearer?
var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance) where (t.ComponentType.GetProperty(t.Name) != null) select t.ComponentType.GetProperty(t.Name);
Y a-t-il des façons de ne pas écrire / appeler t.ComponentType.GetProperty(t.Name)
deux fois ici?
var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance) let u = t.ComponentType.GetProperty(t.Name) where (u != null) select u;
Vous devez let
:
var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance) let name = t.ComponentType.GetProperty(t.Name) where (name != null) select name;
Si vous vouliez le faire dans une syntaxe de requête, vous pourriez le faire d’une manière plus efficace et plus propre:
var q = TypeDescriptor .GetProperties(instance) .Select(t => t.ComponentType.GetProperty(t.Name)) .Where(name => name != null);
Oui, en utilisant le mot let
clé let
:
var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance) let nameProperty = t.ComponentType.GetProperty(t.Name) where (nameProperty != null) select nameProperty;
Il y a 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);
Considérant 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);
Une allocation inutile par article car t
est toujours dans le champ d’application (pas encore utilisé). Le compilateur C # devrait simplement optimiser cela, mais ce n’est pas le cas (ou la spécification du langage ne le permet pas, pas sûr).