添加项目后,如何循环使用此类

时间:2014-04-30 11:41:35

标签: vb.net winforms

通过此方法添加项目后,如何遍历此类。我对通用列表很陌生,所以如果有人能指出我在数据表中正确的方向,我曾经想过要做以下事情:

For Each thisentry In dt.rows

Next

我在集合中使用什么

致电代码 在我的主要课程的分类中调用这个

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

这是我添加文件的方式,但我已经检查了例程,列表的计数是2个产品

     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

尝试

我尝试使用以下

         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,这给出了什么?

2 个答案:

答案 0 :(得分:1)

首先我稍微收缩一下这个声明:

Dim infoNoProductAvail As New List(Of infoProductsNotFound)

接下来,迭代有几个选项。首先(以及你可能最常用的):

For Each info as infoProductsNotFound in infoNoProductAvail 

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

Next

或者您可能想要使用lambda表达式(如果您使用.Net 3.5及以上版本,我认为 - 可能是.Net 4):

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

请记住,泛型是强类型的(与旧的VB集合不同),因此无需抛出任何内容:您可以直接访问属性和方法。

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

(这不是一个很好的例子,但你明白了。)

答案 1 :(得分:1)

For Each语法是一样的。它对所有IEnumerable个对象的工作方式相同。它的唯一“技巧”是确保迭代器变量的类型正确,并确保迭代正确的对象。

对于DataTable,您正在迭代它的Rows属性。该属性是一个IEnumerable对象,包含DataRow个对象的列表。因此,要使用For Each迭代它,必须使用类型为DataRow的迭代器变量(或其基类之一,例如Object)。

要遍历通用List(Of T)IEnumerable对象本身就是List对象。你不需要去其中一个属性。迭代器的类型需要匹配列表中项目的类型:

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

或者:

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

或者:

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