2016-09-30 7 views
1

DataTable.Select проблемы

У меня есть простой DataTable как этотНайти и получить индекс строки в DataTable

| 1 | 2 | 3 | 
|------|------|------| 
| 1966 | 6544 | 1967 | 
| 9560 | 3339 | 4968 | 
| 0 | 9400 | 1765 | 
| 0 | 5479 | 6701 | 

, например, я хочу, чтобы проверить, если 1966 уже существует в колонке «1», и если он существует получить индекс строки я сделать подобный код

Dim search() As DataRow = table.Select(" '" & i & "' = '" & value & "' ") 
    'where i is a integer from 1 to 3 and value is a biginteger 
    If search.Count > 0 Then 
     'get row index 
    Else 
     Console.WriteLine("not found") 
    End If 

ответ

0

Если индекс строк не содержится в значениях самих строк, вам придется отказаться от метода Select и использовать подход, основанный на курсорах. Этот пример остановит цикл, если совпадение найдено:

Dim intTargetIndex As Integer = -1 
Dim intCursor As Integer = 0 

Do Until intCursor = table.Rows.Count OrElse intTargetIndex > -1 

    If table.Rows(intCursor)(0).ToString() = value.ToString() Then 

     intTargetIndex = intCursor 

    End If 

    intCursor += 1 

Loop 
+0

ваш код работал хорошо, чтобы моя проблема, но лучше ли это, чем использовать ** table.Select **? .. @NoAlias ​​ – hagant

+0

Я предполагаю, что это будет немного быстрее, чем таблица. Выберите метод. Во-первых, он остановится при поиске единственного совпадения (аналогично .Any() vs .Count()> 0), во-вторых .IndexOf может быть дороже. Лучший способ узнать наверняка - это профилировать оба метода. – N0Alias

2

Вашего запросу в настоящее время пытается запросить номер поля в виде строк, поэтому, если DataTable столбцов вы запрашивающие действительно ИНТ egers, то правильным синтаксисом будет:

Имена и номера столбцов не имеют одинарных кавычек вокруг них. Затем, чтобы получить индекс, вам нужно будет искать таблицу для индекса строки, которую вы вернули. DataRowCollections есть способ сделать это, вам просто нужно перебирать возвращения в запросе:

For Each dr As DataRow In table.Select(i.ToString & " = " & value.ToString) 
    MsgBox(dr.Table.Rows.IndexOf(dr).ToString) 
Next dr 
1

Используя существующую петлю, просто найдите строку в таблице:

Dim ndx As Int32 
Dim rows = dtSample.Select("Id = 42") 
If rows.Count > 0 Then 
    ndx = dtSample.Rows.IndexOf(rows(0)) 
End If 
Return ndx 

Использование методов расширения, вам может конденсироваться его:

Dim ndx = dtSample.AsEnumerable(). 
       Where(Function(q) q.Field(Of Int32)("Id") = 42). 
       Select(Function(z) dtSample.Rows.IndexOf(z)). 
       ToArray() 

ndx будет массив в этом случае и будет пустым, когда нет матча.

+0

Приятное использование IndexOf. – N0Alias

+0

Я все еще не могу использовать ** table.Select ** 'Dim rows = table.Select (" 1 = 1966 ")' и использовать условие вроде этого '' Если rows.Count> 0 Then' @Plutonix – hagant

Смежные вопросы