преобразовать один объект массива в IEnumerable

Я хочу сравнить два представления сетки данных и использовать метод 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 (в случае 1, 3) и сравнить их с методом исключения. Мой код:

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]", когда я пытаюсь попытаться разыграть exceptItems, следующим образом:

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

Я также пробовал:

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())

И знай, что я ошибаюсь. номер 13. Я думаю, проблема в том, что мне нужно преобразовать itemArray() в IEnumerable, можно ли как-нибудь сделать это без серьезных изменений в моем коде?


person user2554904    schedule 07.07.2013    source источник


Ответы (2)


Поскольку у вас нет option strict, компилятор не знает, какого типа ваш itemArray(), поэтому он использует наименьший общий знаменатель объекта.

Вы должны включить опцию strict, а затем исправить ошибки. Вы можете сделать это либо в свойствах проекта, либо вверху класса, используя Options Strict. Отказ от использования strict является пережитком со времен vb6 и действительно помогает избежать подобных проблем. Это заставит вас определить ваши переменные такими, какими они должны быть.

person Ceres    schedule 07.07.2013
comment
Холли боже! Благодарность! Я включил эту штуку и увидел много работы... Я снова ее выключу... - person user2554904; 08.07.2013

Except есть только на интерфейсе IEnumerable(Of T), а не на ванильном IEnumerable.

IEnumerable(Of T) реализован на простом массиве, поэтому вам не нужно дважды загружать данные.

Кроме того, поскольку Except является методом расширения, вам необходимо импортировать System.Linq.

person Curt    schedule 07.07.2013
comment
Привет спасибо! Итак, есть ли способ преобразовать объекты system.string в system.IEnumerable(of T)? - person user2554904; 08.07.2013
comment
Ну, строка - это IEnumerable(of Char)... Но это не похоже на то, что вам нужно... - person Curt; 08.07.2013
comment
Привет спасибо! Я вижу, что если я реализую IEnumerable, я получу IEnumerable (из Char). Чтобы предотвратить это, мне, возможно, следует использовать список или Arraylist и избегать метода .toarray? Все нормально! Поскольку нет проблем с использованием этого для моих значений списка dgv1, как я могу использовать их для хранения значений из моего dgv2? Спасибо! - person user2554904; 09.07.2013