Поиск в списке <DataRow>? - PullRequest
       21

Поиск в списке <DataRow>?

9 голосов
/ 15 июня 2010

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

Ответы [ 5 ]

9 голосов
/ 15 июня 2010
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 голосов
/ 15 июня 2010

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

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

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

0 голосов
/ 15 июня 2010

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

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

И после этого сделаю поиск:

if (list.ContainsValue("Value"))
0 голосов
/ 15 июня 2010

Ну, это зависит от того, какую версию 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 с помощью итераторов в C # 2.0 и выше.

0 голосов
/ 15 июня 2010

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

...