我可以在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#编译器应该只是优化它,但它不(或语言规范不允许它,不知道)。