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

我想使用LINQ到对象进行以下操作,并且似乎找不到方法:

From m as Product in Me _
  Select m With {.Match = m.Name.IndexOf(query)} _ 
  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 _
              } 

其他提示

在vb.net中,关键字有两种用途 With.

第一个是对象初始化。这是在与初始化表达式相同的行中分配对象的属性或字段的一种手段,而无需为每个字段的每个排列构建特定的构造函数。

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

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

第二种是 With 陈述。这使您可以将一个对象放在上下文中,以说话并致电许多。没有资格进行操作。

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

使用扩展方法 System.Object 接受lambda,您可以相当仔细地模拟此功能。 这个答案中有一个例子, ,但它在C#中。转换为vb.net可能并不难。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top