Search code examples
vb.netlinq

Linq ToList does nothing


I have Option Strict and Option Infer both set "On".

This code works fine:

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

Why can't I combine them into the one line below (I believe it's related to the fact that the first line above does not set tBoxes to a list but remains an IEnumerable even though I am calling ToList, why is this?)

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

This code results in an error

Expression does not produce a value

This might seem like much ado about nothing but it's not just the reduction to one line, I'd like to understand what's going on here.

VB.NET 2010


Solution

  • The problem is not the ToList call, but List.ForEach Method which is Sub, hence does not have a result and cannot be assigned to a variable.

    If you want to use a single line, remove Dim tBoxes =.

    Update In fact there is another problem in the above code.

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

    is equivalent to

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

    so obviously tBoxes is IEnumerable<TextBox>.

    Since the from t In .. part is unnecessary in this case, the "oneliner" should be something like this

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

    If you really need a query part, to avoid such confusions, don't forget to enclose it in (..) before calling ToList or other methods like Count, Any etc., like this

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