是否可以在现有对象上使用'With'关键字?
我想使用LINQ to对象进行以下操作,似乎无法找到方法:
From m as Product in Me _
Select m With {.Match = m.Name.IndexOf(query)} _
Where m.Name.IndexOf(query) > 0
答案 0 :(得分:2)
在VB.Net中,关键字With
有两种用途。
第一个是对象初始化。它是一种在初始化表达式的同一行中分配对象的属性或字段的方法,而不需要为每个字段排列设置特定的构造函数。
Dim x = New Product With {.Name = "Foo"}
此类型的表达式只能用于创建新对象。它不能用于修改现有的。
第二种用法是With
语句。这允许您将对象置于上下文中以便说出并调用许多对象。没有资格的操作。
With x
Console.WriteLine(.Name)
.Match = 42
End With
这些都不允许您使用现有对象作为模板来创建新对象。
答案 1 :(得分:1)
没有。问题是With
关键字(对象初始化关键字,而不是语句)只能在创建新对象后使用。
The VB team thinks使用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
答案 2 :(得分:1)
没有办法做到这一点(With
只能用于构造函数)。它会违反linq构建的功能原则,特别是不存在副作用。
最好的办法是在您的选择中创建一个新产品,并设置匹配属性。
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 _
}
答案 3 :(得分:0)
使用System.Object
上的扩展方法接受lambda,您可以非常接近地模拟这样的特征。 There's an example in this answer,但它在C#中。翻译成VB.NET可能并不太难。