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

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

9
задан VMAtm 26 September 2017 в 14:33
поделиться

5 ответов

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
9
ответ дан 4 December 2019 в 21:47
поделиться

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

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

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

if (list.ContainsValue("Value"))
0
ответ дан 4 December 2019 в 21:47
поделиться

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

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

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

0
ответ дан 4 December 2019 в 21:47
поделиться

Ну, это зависит от того, на какой версии 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 или методов расширения, которые идут с ним, вам придется искать в списке "old 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. В основном я перечислял последовательность, члены которой больше не действительны.

Вы можете легко создавать свои собственные отложенные IEnumerable с помощью итераторов в C # 2.0 и выше.

0
ответ дан 4 December 2019 в 21:47
поделиться

http://dotnetperls.com/list-find-methods есть кое-что о exists & find.

0
ответ дан 4 December 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: