是否可以在现有对象上使用“With”关键字?
我想使用 LINQ to 对象执行以下操作,但似乎找不到方法:
From m as Product in Me _
Select m With {.Match = m.Name.IndexOf(query)} _
Where m.Name.IndexOf(query) > 0
是否可以在现有对象上使用“With”关键字?
我想使用 LINQ to 对象执行以下操作,但似乎找不到方法:
From m as Product in Me _
Select m With {.Match = m.Name.IndexOf(query)} _
Where m.Name.IndexOf(query) > 0
在 VB.Net 中,关键字有两种用途With
。
首先是对象初始化。它是一种在初始化表达式的同一行中分配对象的属性或字段的方法,而无需为每个字段排列使用特定的构造函数。
Dim x = New Product With {.Name = "Foo"}
这种类型的表达式只能用于创建新对象。它不能用于修改现有的。
第二个用途是With
语句。这允许您将一个对象放在上下文中,可以这么说并调用 many 。无资格对其进行操作。
With x
Console.WriteLine(.Name)
.Match = 42
End With
但是,这些都不允许您使用现有对象作为创建新对象的模板。
不行。问题是With
关键字(对象初始化关键字,不是语句)只能在创建新对象后使用。
VB 团队认为With
在现有对象上使用的副作用太令人困惑了。
关于您的问题:如果Match
还不是 的属性Product
,最干净的解决方案可能是将所需的输出封装在一个新对象中:
From m as Product in Me _
Select New With {.Match = m.Name.IndexOf(query), .Product = m} _
Where m.Name.IndexOf(query) > 0
不,没有办法做到这一点(With
只能与构造函数一起使用)。这将违反构建 linq 的功能原则,特别是不会有副作用。
最好的办法是使用 Match 属性集在您的选择中创建一个新产品。
From m as Product in Me _
Where m.Name.IndexOf(query) > 0 _
Select New Product() With _
{ _
.Match = m.Name.IndexOf(query), _
...apply the rest of m's properties _
}
使用接受 lambda 的扩展方法System.Object
,您可以非常接近地模拟这样的功能。这个答案中有一个例子,但它在 C# 中。翻译成 VB.NET 可能并不难。