2013-07-07 1 views
0

Я хочу сравнить два datagridviews и использовать метод Except на интерфейсе IEnumerable, чтобы узнать разницу между ними. Один пример моих DataGridViews:конвертировать один объект массива в IEnumerable

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

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

ответ

1

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

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

+0

Холли бог! благодаря! Я включил эту штуку и увидел много работы ... Я выключу ее снова ... – user2554904

1

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

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

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

+0

Привет, спасибо! Итак, есть ли способ конвертировать объекты system.string в system.IEnumerable (из T)? – user2554904

+0

Ну, строка IEnumerable (Char) ... Но это не похоже на то, что вам нужно ... – Curt

+0

Привет! Я вижу, что если я реализую IEnumerable, я получу IEnumerable (из Char). Чтобы предотвратить это, я, возможно, должен использовать список или Arraylist и избежать метода .toarray? Ничего страшного! Поскольку нет смысла использовать это для моих значений списка dgv1, как я могу использовать их для хранения значений из моего dgv2? Спасибо! – user2554904