2010-06-15 2 views
8

У меня есть список, который я создаю из DataTabe, в котором есть только один столбец. Допустим, что столбец называется MyColumn. Каждый элемент в списке представляет собой массив объектов, содержащий мои столбцы, в этом случае только один (MyColumn). Какой самый элегантный способ проверить, содержит ли этот массив объектов определенное значение?Поиск в списке <DataRow>?

ответ

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

http://dotnetperls.com/list-find-methods что-то о существует & найти.

+0

Дело в том, что список содержит массив, который мне нужно искать в ... поэтому я думаю, что мне не нужно искать список, но массив (ы) внутри списка. – grady

0

Ну, это зависит от того, какая версия C# и .NET вы на, для 3.5 вы можете сделать это с помощью 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; 

Это даст вам обе строки, которые соответствуют и логическое значение который говорит вам, если вы нашли его вообще.

Однако, если у вас нет LINQ или методы расширения, которые приходят с ней вы должны искать список «старый SKOOL»:

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

bool valueFound = matchingRow != null; 

который даст вам первую строку, которая соответствует, его очевидно, могут быть изменены, чтобы найти все строки, которые соответствуют, что сделало бы два примера более или менее равными.

Версия LINQ имеет большое различие, но IEnumerable, который вы получаете от нее, отложен, поэтому вычисление не будет выполнено, пока вы на самом деле не перечислите его членов. Я не знаю достаточно о DataRow или вашем приложении, чтобы узнать, может ли это быть проблемой или нет, но это было проблемой в части моего кода, которая касалась NHibernate. В основном я перечислял последовательность, члены которой больше недействительны.

Вы можете создать свои собственные отложенные IEnumerables легко через iterators в C# 2.0 и выше.

0

Если вам нужно делать этот поиск часто, я думаю, что не всегда удобно писать LINQ-выражение. Я бы написать расширение-метод, как это:

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

И после этого макияжем поиска:

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

я, возможно, неправильно это, но похоже, что данные в настоящее время в List<object[]> и не в DataTable так, чтобы получить элементы, которые соответствуют определенным критериям вы могли бы сделать что-то вроде:

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

пунктов будет ваш список объектов []: с и соответствовал бы IEnumerable []> с объектом []: s со значением в.

+0

Нет, его в списке , который содержит массив объектов ... – grady

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