Linq ToList什么都不做

时间:2015-12-01 17:24:44

标签: vb.net linq

我有Option Strict和Option Infer都设置为“On”。

此代码可以正常工作:

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

为什么我不能将它们组合成下面的一行(我相信它与上面第一行没有将tBox设置为列表但仍然是IEnumberable这一事实相关,即使我调用“ToList”,为什么此?)

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

这给出了“表达式不产生值”的错误

这似乎无关紧要,但这不仅仅是减少到一行,我想了解这里发生了什么。

VB.NET 2010

2 个答案:

答案 0 :(得分:3)

问题不在于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,{{1}之前将其封在Count中等等,像这样

Any

答案 1 :(得分:1)

小描述但足以理解

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。