2

是否可以在现有对象上使用“With”关键字?

我想使用 LINQ to 对象执行以下操作,但似乎找不到方法:

From m as Product in Me _
  Select m With {.Match = m.Name.IndexOf(query)} _ 
  Where m.Name.IndexOf(query) > 0
4

4 回答 4

2

在 VB.Net 中,关键字有两种用途With

首先是对象初始化。它是一种在初始化表达式的同一行中分配对象的属性或字段的方法,而无需为每个字段排列使用特定的构造函数。

Dim x = New Product With {.Name = "Foo"}

这种类型的表达式只能用于创建新对象。它不能用于修改现有的。

第二个用途是With语句。这允许您将一个对象放在上下文中,可以这么说并调用 many 。无资格对其进行操作。

With x
    Console.WriteLine(.Name)
    .Match = 42
End With

但是,这些都不允许您使用现有对象作为创建新对象的模板。

于 2010-03-24T23:12:13.267 回答
1

不行。问题是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
于 2010-03-24T22:54:24.280 回答
1

不,没有办法做到这一点(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 _
              } 
于 2010-03-24T22:57:35.367 回答
0

使用接受 lambda 的扩展方法System.Object,您可以非常接近地模拟这样的功能。这个答案中有一个例子,但它在 C# 中。翻译成 VB.NET 可能并不难。

于 2010-03-24T23:04:33.500 回答