2014-04-30 2 views
0

이 메서드를 통해 항목을 추가하면이 클래스를 반복하는 방법은 무엇입니까? 그냥 누군가가 datatables에서 올바른 방향으로 날 지점 수 있다면 그렇게하는 데 사용되는 메신저 wonding 된 제네릭 목록에 아주 새로운 오전 다음 :이 호출 코드 호출 컬렉션어떻게 아이템을 추가하면이 클래스를 반복합니까?

에 사용합니까 무엇

For Each thisentry In dt.rows 

Next 

메인 클래스의 내 delciarations에

Dim infoNoProductAvail As List(Of infoProductsNotFound) = New List(Of infoProductsNotFound)() 

이 내가 파일을 추가하고 있지만이 루틴에서 확인하고 목록의 카운트가이 개 제품에 얼마나입니다

,
 If medProductInfo.SKU.SKUID = 0 Then 
      infoNoProductAvail.Add(New infoProductsNotFound(thisenty2.Item("EAN13").ToString(), True)) 
     End If 

이이 클래스는

Public Class infoProductsNotFound 
     Public Sub New(tbcode As String, notfound As Boolean) 
      Me.tagbarcode = tbcode 
      Me.notfound = notfound 

     End Sub 
     Private tagbarcode As String = String.Empty 
     Private notfound As Boolean 

     Public Property tbcode() As String 
      Get 
       Return tagbarcode 
      End Get 
      Set(ByVal value As String) 
       tagbarcode = value 
      End Set 

     End Property 

     Public Property isNotFound() As Boolean 
      Get 
       Return notfound 
      End Get 
      Set(ByVal value As Boolean) 
       notfound = value 
      End Set 

     End Property 
    End Class 

사용 해봤

을 시도 itselfs 다음

  Function BuildExceptionsForEmail() 
      Dim retval As String = "" 
      Dim cnt As Int32 = 0 
      retval = "The following products are not avialable" & vbCrLf 
      For Each info As infoProductsNotFound In infoNoProductAvail 


        retval &= info.tbcode 

        cnt &= 1 
      Next 
      Return retval 

하지만이 시점에서 어떤 이유로 내 정보 noproductAvail가 비어도에 불구하고 루틴이 2 위에 올 때 루틴은 무엇을 제공합니까? 몇 가지 옵션이 반복,

Dim infoNoProductAvail As New List(Of infoProductsNotFound) 

다음 :

+1

foreach는 thisentry :

For Each i As infoProductsNotFound In infoNoProductAvail ' ... Next 

또는 :

Dim i As infoProductsNotFound For Each i In infoNoProductAvail ' ... Next 

또는 반복자의 종류는 목록에있는 항목의 유형과 일치해야합니다 infoNoProductAvail ?? –

답변

1

먼저 그 선언을 약간 줄어들 것입니다.

For Each info as infoProductsNotFound in infoNoProductAvail 

    If info.tbCode = "xyz" Then 
     DoSomething(info) 
    End If 

Next 

또는 당신은 람다 표현식을 사용 할 수 있습니다 (당신은 닷넷 3.5 내가 생각하는 이상을 사용하는 경우 - 4 닷넷 수 있습니다) : 첫 번째 (그리고 당신은 무엇을 가능성에 가장 많이 사용되는 것)

infoNoProductAvail.ForEach (Function(item) DoSomething(item)) 

는 제네릭 강하게 (옛 VB 컬렉션과는 달리) 입력되는 것을 기억 때문에 캐스팅 할 필요가 나오는대로 : 직접 속성과 메서드에 액세스 할 수 없습니다.

If infoNoProductAvail(3).isNotFound Then 
    'Do something 
End If 

(좋은 예는 아니지만 아이디어를 얻을 수 있습니다.)

+1

LINQ 및 Lambda식이 3.5에 추가되었습니다. 그러나'List (Of T) .ForEach' 메서드는 LINQ보다 선행합니다. 2.0으로 돌아갑니다. 또한 람다 식은 컴파일러의 함수이기 때문에 최신 버전의 Visual Studio를 사용하여 컴파일하는 경우 오래된 프레임 워크 버전을 대상으로 사용할 수 있습니다. 따라서 Visual Studio의 새 버전을 사용하는 한 2.0 프레임 워크를 타겟팅 할 때도이 예제 코드를 사용할 수 있습니다. –

+0

니스! 매일 새로운 것을 배웁니다. 나는'List (Of T) .ForEach'가 3.5 이전에 존재했다는 것을 깨닫지 못했습니다. 그 전에는 LINQ 나 lambda 표현에 노출 된 적이 없었기 때문입니다. –

+0

@StevePettifer 답장을 보내 주셔서 고맙습니다. 이메일을 위해 빌드 한 것입니다. 이메일에 대한 정보를 얻지는 않았지만, 위의 루틴에 항목을 추가하는 경우에도 클래스에 항목을 추가 할 수 있습니다. – rogue39nin

1

For Each 구문은 동일합니다. 모든 IEnumerable 개체에 대해 동일한 방식으로 작동합니다. 유일한 "트릭"은 반복자 변수가 올바른 유형인지 확인하고 올바른 객체를 반복 처리하는지 확인하는 것입니다.

DataTable의 경우에는 Rows 속성을 반복합니다. 이 속성은 DataRow 개체 목록을 포함하는 IEnumerable 개체입니다. 따라서 For Each으로 반복하려면 DataRow 유형의 반복 변수 (또는 기본 클래스 중 하나 인 Object)를 사용해야합니다.

일반 List(Of T)을 통해 반복하려면 IEnumerable 개체가 List 개체 자체입니다. 당신은 그 속성 중 하나에 갈 필요가 없습니다.에

For Each i As Object In infoNoProductAvail 
    ' ... 
Next 

+0

이 두 가지를 모두 표시하는 올바른 대답이기도합니다. – rogue39nin

관련 문제