VB.NET是否在现有对象上使用关键字?

VB.NET是否在现有对象上使用关键字?,vb.net,linq-to-objects,with-statement,Vb.net,Linq To Objects,With Statement,是否有可能在现有对象上使用“With”关键字 我想使用LINQ to对象执行以下操作,但似乎找不到方法: From m as Product in Me _ Select m With {.Match = m.Name.IndexOf(query)} _ Where m.Name.IndexOf(query) > 0 不可以。问题是With关键字(对象初始化关键字,而不是语句)只能在创建新对象后使用 在现有对象上使用和的副作用太令人困惑了 关于您的问题:如果Match还不是Pr

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

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

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

不可以。问题是
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构建的功能原则,特别是不会产生副作用

最好的选择是使用“匹配”属性集在select中创建新产品

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可能不太难。

在VB.NET中,关键字
有两种用法

第一个是对象初始化。它是一种在初始化表达式的同一行中指定对象的属性或字段的方法,而不需要为字段的每个排列指定特定的构造函数

Dim x = New Product With {.Name = "Foo"}
这种类型的表达式只能用于创建新对象。它不能用于修改现有的

第二个用法是
With
语句。这允许您将一个对象放到上下文中,可以说,并调用多个对象。在没有资格的情况下对其进行操作

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

但这两种方法都不允许将现有对象用作创建新对象的模板

你读过那篇文章吗?在我看来,他们似乎强烈反对这个想法。这正是我需要实现的!谢谢