我可以在LINQ中声明/使用一些变量吗?
例如,我可以编写以下LINQ清除程序吗?
var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
where (t.ComponentType.GetProperty(t.Name) != null)
select t.ComponentType.GetProperty(t.Name);
Run Code Online (Sandbox Code Playgroud)
有没有办法不在t.ComponentType.GetProperty(t.Name)
这里写/打两次?
It'*_*ie. 85
你需要let
:
var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
let name = t.ComponentType.GetProperty(t.Name)
where (name != null)
select name;
Run Code Online (Sandbox Code Playgroud)
如果您想在查询语法中执行此操作,则可以以更高效(afaik)和更清晰的方式执行此操作:
var q = TypeDescriptor
.GetProperties(instance)
.Select(t => t.ComponentType.GetProperty(t.Name))
.Where(name => name != null);
Run Code Online (Sandbox Code Playgroud)
Kin*_*ing 79
var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
let u = t.ComponentType.GetProperty(t.Name)
where (u != null)
select u;
Run Code Online (Sandbox Code Playgroud)
Mat*_*ten 14
是的,使用let
关键字:
var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
let nameProperty = t.ComponentType.GetProperty(t.Name)
where (nameProperty != null)
select nameProperty;
Run Code Online (Sandbox Code Playgroud)
有一个很少人知道的替代方案(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;
Run Code Online (Sandbox Code Playgroud)
这转化为:
var q = TypeDescriptor.GetProperties(instance)
.Select(t => t.ComponentType.GetProperty(t.Name))
.Where(prop => prop != null);
Run Code Online (Sandbox Code Playgroud)
而let
基于版本的版本转换为:
var q = TypeDescriptor.GetProperties(instance)
.Select(t => new { t, prop = t.ComponentType.GetProperty(t.Name) })
.Where(x => x.prop != null)
.Select(x => x.prop);
Run Code Online (Sandbox Code Playgroud)
每个项目的不必要分配,因为t
仍在范围内(尚未使用).C#编译器应该只是优化它,但它没有(或语言规范不允许它,不确定).
归档时间: |
|
查看次数: |
7411 次 |
最近记录: |