我可以在LINQ中声明/使用一些variables吗? 或者我可以写下面的LINQ清除器?

我可以在LINQ中声明/使用一些variables吗?

例如,我可以写下面的LINQ清除器吗?

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

有没有办法不写/在这里调用t.ComponentType.GetProperty(t.Name)两次?

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

你需要let

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

如果你想在查询语法中做到这一点,你可以用更有效的方法来做到这一点:

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

是的,使用let关键字:

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

有一个替代scheme,很less有人知道( 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; 

这意味着:

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

而基于版本的版本转化为:

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

每个项目不必要的分配,因为t仍然在范围内(尚未使用)。 C#编译器应该只是优化它,但它不(或语言规范不允许它,不知道)。