将一个数组对象转换为IEnumerable

时间:2013-07-07 14:22:24

标签: arrays vb.net list except

我想比较两个datagridviews,并使用Except接口上的IEnumerable方法,以了解它们之间的区别。 我的datagridviews的一个例子:

DG1

idProduct     Item 

1             Item A
1             Item B
2             Item C
2             Item D

DG2
idProduct Item    Price IdSupplier
1         Item A  10.00 1
1         Item B  20.00 1
2         Item C  30.00 1
2         Item D  40.00 1
1         Item A  20.00 3
1         Item B  30.00 3
2         Item C  40.00 3
2         Item D  50.00 3

所以,我试图将dgv1中的数据放入一个数组,将dgv2中的数据放入一个动态数组中,因为我想要一个每个IdSupplier的列表(在case,1,3)并将它们与except方法进行比较。我的代码是:

Imports System.Data.SqlClient
Imports System.Data
Imports datagridviewTota.DataSet1TableAdapters
Imports System.Collections.Generic
Imports System.Collections.ArrayList
Imports System.Collections.CollectionBase

Public Class form1

Public itemArray()
Public ItemListArray()
Public Shared j As Integer

Private sub main ()

   (…)
   Dim ds1 As New DataSet
   Dim item As List(Of String) = New List(Of String)
   Dim Id As Integer
   Dim dr As DataRow
   Dim dr1 As DataRow
   Dim itemList As List(Of String) = New List(Of String)
   Dim idSuppliers () as integer
   ReDim itemArray(j) ‘ j represents the numbers of elements in idSuppliers() (third column of dg2)

 Try
    //create an array for the dgv1//
    For Each row As DataGridViewRow In dgv1.Rows                  
       item = dgv1.Rows(row.Index).Cells(1).Value
       itemList.Add(item)                                
    Next

    Dim itemListArray = itemList.toArray()

    //create a dynamic array for the dgv2 by filtering for each idSuppliers, put the values from the second column into a list and convert each list into a dynamic array//

    For Each element In idSuppliers
       Dim dv As New DataView()
       dv = New DataView(ds1.Tables("idProduct"))
            With dv
                .RowFilter = "idSupplier = " & element & " "
            End With
       dgv2.DataSource = dv

       For Each row As DataGridViewRow In dgv2.Rows                 
          Id = dgv2.Rows(row.Index).Cells(3).Value

          If Id = element Then
             item = dgv2.Rows(row.Index).Cells(1).Value
             itemList.Add(item)                         
          End If                            
       Next

       itemArray(i) = itemList.ToArray()
       itemList.clear()

       i = i + 1     
    Next
end sub

所以,我尝试了IEnumerable.Except,但似乎我的itemArray()是一个对象,因为我收到消息"System.linq.Enumerable+<ExceptIterator>d_99'1[System.Object]",当我尝试投射{{1}如下:

exceptItems

我也尝试过:

Dim exceptItems = itemListArray.Except(itemArray(2))

知道我犯了错误。数字13.我认为问题在于我必须将Dim onlyInFirstSet As IEnumerable(Of String) = itemListArray.Except(itemArray(2)) Dim output As New System.Text.StringBuilder For Each str As String In onlyInFirstSet output.AppendLine(str) Next MsgBox(output.ToString()) 转换为itemArray(),如果我的代码没有重大更改,有什么方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

由于您没有option strict,编译器不知道您的itemArray()是什么类型,因此它使用对象的最小公分母。

您应该打开选项严格,然后修复错误。您可以使用Options Strict在项目属性中或在类的顶部执行此操作。不使用严格是从vb6天暂停,真的有助于避免这样的问题。它会强制您将变量定义为它们应该是什么。

答案 1 :(得分:1)

Except仅在IEnumerable(Of T)界面上,而不在香草IEnumerable上。

IEnumerable(Of T)在普通数组上实现,因此您不必双重加载数据。

此外,由于Except是一种扩展方法,因此您需要导入System.Linq