2011-05-16 13 views
13

Klasik For Each döngüsünü VB.NET'te LINQ ForEach uzantısıyla değiştirmeye çalışıyorum ...LINQ's ForEach'in VB.NET'te anonim yöntemlerle kullanılması

 Dim singles As New List(Of Single)(someSingleList) 
    Dim integers As New List(Of Integer) 

    For Each singleValue In singles 
    integers.Add(CInt(Math.Round(singleValue))) 
    Next singleValue 

Belki de böyle bir şey?

 singles.ForEach(Function(s As [Single]) Do ??? 

Bunu anonim yöntemler kullanarak (yani yeni bir işlev bildirmeden) doğru bir şekilde nasıl yapabilirim?

cevap

18

bu deneyin: For Each döngünün gövdesi değer döndürmez çünkü

singles.ForEach(Sub(s As [Single]) integers.Add(CInt(Math.Round(s)))) 

Burada bir Sub gerekir.

1

Satır içi ifadenin bir değer döndürmesini beklerseniz, bir İşlev kullanırsınız. Örneğin:

Dim myProduct = repository.Products.First(Function(p) p.Id = 1) 

Bu da Boolean değerlendirir şey, çünkü bir işlev ifadesini kullanmak (p.Id = 1) olur.

Sen ifadeden döndürülen hiçbir şey yoktur, çünkü bir Sub kullanmak gerekir:

singles.ForEach(Sub(s) integers.Add(CInt(Math.Round(s)))) 
+0

İlk kodu anlama ... sonunda nihayet 'Dim myProduct = false 'var mı? – serhio

+0

Hayır ... bu, Boolean'a değerlendiren iç işlevdir, dış işlev bir Ürün verir. İki kullanım arasındaki farkı göstermeye çalışıyordu; First() yöntemi, her öğeyi doğru/yanlış olarak değerlendiren bir yüklem süzgecini alır; bu durumda, Id öğesiyle bir öğe aranır. ForEach işleci, bir eylem gerçekleştirerek yinelenir, ancak hiçbir şey döndürmez. – RichardW1001

3

.ForEach uzatma yöntemi kullanılarak, sadece doğrudan sonuçlar bu şekilde üretebilir Aksine o:

Dim integers = singles.Select(Function(x) Math.Round(x)).Cast(Of Integer)() 

Ya da böyle, .Cast kullanmadan:

Dim integers = singles.Select(Function(x) CInt(Math.Round(x))) 

List(Of Integer)'u önceden tanımlamanıza gerek kalmadan kaydeder ve ayrıca bir dönüşümü uyguladığınızı ve sonuç ürettiğinizi (ödevin açık olduğu gibi) daha net olduğunu düşünüyorum.

Not: Bu, List(Of Integer) kullandığı çoğu yerde kullanılabilen birüretmiştir, ancak buna ekleyemezsiniz. Bir List istiyorsanız, yukarıdaki kod örneklerinin sonuna .ToList() numaralı etikete bağlanın.

İlgili konular