2012-07-03 55 views
1

我是这个linq东西的新手。我以前从未使用任何linq。所以当我有一个场景将选定的项目从左侧列表移动到右侧列表时,我已经从C#中的搜索中找到了一个很好的解决方案,但是我将它转换为VB。这里是代码我有vb.net中的lambda表达式错误

Dim leftItems = lb_left.Items.Cast(Of ListItem)().ToList() 

Dim rightItems = lb_right.Items.Cast(Of ListItem)().ToList() 

'Get all selected items from left box 

Dim LeftSelectedItems = leftItems.Where(Function(a) a.Selected).ToList() 

'Add all selected items to right box 
'Clear lb_right Items and add sorted list 

lb_right.Items.Clear() 

LeftSelectedItems.Union(rightItems).OrderBy(Function(a) a.Text).ToList().ForEach(Function(b) lb_right.Items.Add(b)) 

'Remove all selected items from left box 

LeftSelectedItems.ForEach(Function(a) lb_left.Items.Remove(a)) 

以上是我从网上找来的代码来左右移动列表框中。但在ForEach该函数它给我一个有点错误“表达式不会产生一个值”

我真的得到了这个错误stucked。请求您的回复速度快..

回答

7
LeftSelectedItems.ForEach(Sub(a) lb_left.Items.Remove(a)) 
1

从文档VB lambda expressions

单行函数的主体必须是返回一个值,而不是一份声明中表达。单行函数没有Return语句。单行函数返回的值是函数体中表达式的值。

正如编译器所说,Add不返回一个值。

我相信你可以使用Sub代替Function,并使用多版本 - 但我不认为这是在这里工作的最佳方式。

它看起来像你应该创建一个查询,然后使用一种“添加所有这些项目”的电话。不幸的是,你还没有告诉我们的类型lb_right,甚至无论你使用WPF,WinForms的,ASP.NET等

0

我认为LINQ的应主要用于解答疑问,做一套操作和做预测。 (所谓的副作用免费opertations?)你已经完成与Linq的设置操作。那很好。然后,我将改变这消除了实际元素

LeftSelectedItems.ForEach(Function(a) <b>lb_left.Items.Remove(a)</b>) 

声明成类似:

For Each item as ListItem in LeftSelectedItems 
    Dim itemInDropDown as ListItem = lb_left.Items.FindByValue(item.Value) 

    If Not itemInDropDown is nothing Then 
     lb_left.Items.Remove(itemInDropDown) 
    End If 

Next 

希望这有助于! (代码未勾选)