Linq ToList不执行任何操作

j2datikz  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(154)

我将Option StrictOption Infer都设置为“开”。
以下代码工作正常:

Dim tBoxes = From t In MainForm.Frame2.Controls.OfType(Of TextBox).ToList
tBoxes.ToList().ForEach(Sub(c) c.DataBindings.Clear())

为什么我不能将它们合并到下面的一行中(我相信这与上面的第一行没有将tBoxes设置为列表而是保持IEnumerable的事实有关,即使我调用ToList,这是为什么?)

Dim tBoxes = From t In MainForm.Frame2.Controls.OfType(Of TextBox).ToList.ForEach(Sub(c) c.DataBindings.Clear())

此代码会导致错误
表达式不生成值
这可能看起来像是无事生非,但它不仅仅是减少到一行,我想了解这里发生了什么。
VB.NET 2010版

5cg8jx4n

5cg8jx4n1#

问题不在于ToList调用,而在于List.ForEach Method,它是Sub,因此没有结果,不能赋给变量。
如果要使用单行,请删除Dim tBoxes =

更新实际上在上面的代码中还有另一个问题。

Dim tBoxes = From t In MainForm.Frame2.Controls.OfType(Of TextBox).ToList

相当于

Dim tBoxList = MainForm.Frame2.Controls.OfType(Of TextBox).ToList
Dim tBoxes = From t in tBoxList

所以很明显tBoxesIEnumerable<TextBox>
由于from t In ..部分在本例中是不必要的,因此“oneliner”应该如下所示

MainForm.Frame2.Controls.OfType(Of TextBox).ToList.ForEach(Sub(c) c.DataBindings.Clear())

如果您确实需要查询部分,为了避免这种混淆,不要忘记在调用ToList或其他方法(如CountAny等)之前将其包含在(..)中,如下所示

(from t In MainForm.Frame2.Controls.OfType(Of TextBox)).ToList.ForEach(Sub(c) c.DataBindings.Clear())
u5rb5r59

u5rb5r592#

描述不多,但足以理解

From t In MainForm.Frame2.Controls.OfType(Of TextBox) 'Filter all object of type text box  
.ToList  'Convert IEnemerable(Of TextBox) to a IList type. 
.ForEach(Sub(c) c.DataBindings.Clear())' Iterate through list and remove bindg of each text box

问题是.ForEach不返回任何值,因此没有任何东西可以分配给您创建的tBoxes对象。它就像VB.net中的void方法或Sub。

相关问题