2012-07-03 72 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 

希望這有助於! (代碼未勾選)