2010-06-15 10 views
8

Mam listę, które utworzyć z DataTabe, który ma tylko jedną kolumnę w nim. Powiedzmy, że kolumna nazywa się MyColumn. Każdy element na liście jest tablicą obiektów zawierającą moje kolumny, w tym przypadku tylko jedną (Moja kolumna). Jaki jest najbardziej elegancki sposób sprawdzenia, czy ta tablica obiektów zawiera pewną wartość?Wyszukaj na liście <DataRow>?

Odpowiedz

9
var searchValue = SOME_VALUE; 
var result = list.Where(row => row["MyColumn"].Equals(searchValue)); // returns collection of DataRows containing needed value 
var resultBool = list.Any(row => row["MyColumn"].Equals(searchValue)); // checks, if any DataRows containing needed value exists 
0

Cóż, to zależy od tego, jaka wersja C# i .NET jesteś, przez 3,5 można zrobić z LINQ:

var qualiyfyingRows = 
    from row in rows 
    where Equals(row["MyColumn"], value) 
    select row; 

// We can see if we found any at all through. 
bool valueFound = qualifyingRows.FirstOrDefault() != null; 

który daje zarówno wiersze spełniające i bool który mówi ci, czy w ogóle coś znalazłeś.

Jednak jeśli nie masz LINQ lub metod rozszerzeń, które pochodzą z nim trzeba będzie przeszukać listę „Old Skool”:

DataRow matchingRow = null; 
foreach (DataRow row in rows) 
{ 
    if (Equals(row["MyColumn"], value)) 
    { 
     matchingRow = row; 
     break; 
    } 
} 

bool valueFound = matchingRow != null; 

która daje pierwszy wiersz, który pasuje, to można oczywiście zmienić, aby znaleźć wszystkie wiersze, które pasują, co sprawiłoby, że dwa przykłady byłyby mniej więcej równe.

Wersja LINQ ma jednak zasadniczą różnicę, ale licznik IEnumerable, który można uzyskać z niej, jest odroczony, więc obliczenia nie zostaną wykonane, dopóki nie wyliczysz jego członków. Nie wiem wystarczająco dużo o DataRow lub twojej aplikacji, aby wiedzieć, czy to może być problem, czy nie, ale był to problem w kawałku mojego kodu, który zajmował się NHibernate. Zasadniczo wyliczyłem sekwencję, której członkowie już nie są ważni.

Możesz samodzielnie tworzyć własne odroczone obiekty IEnumerables, używając iterators w C# 2.0 i wyższych.

0

Jeśli często powinieneś wyszukiwać, myślę, że nie jest wygodne pisanie za każdym razem wyrażenia LINQ. Chciałbym napisać przesuwnych metody takie jak to:

private static bool ContainsValue(this List<DataRow> list, object value) 
{ 
    return list.Any(dataRow => dataRow["MyColumn"].Equals(value)); 
} 

a potem make wyszukiwania:

if (list.ContainsValue("Value")) 
0

może mam błędne odczytanie tego, ale wydaje się, że dane są obecnie w List<object[]> a nie w DataTable tak aby elementy spełniające określone kryteria można zrobić coś takiego:

var matched = items.Where(objArray => objArray.Contains(value)); 

pozycji byłby to lista obiektów []: S i dopasowane byłoby IEnumerable []> z obiektu []: s z wartością.

+0

Nie, znajduje się na liście , która zawiera tablicę obiektów ... – grady