У меня есть Список, который я создаю из DataTabe, который только имеет один столбец в нем. Позволяет говорят, что столбец называют MyColumn. Каждый элемент в списке является объектным массивом, содержащим мои столбцы, в этом случае, только один (MyColumn). Что состоит в том, чтобы проверить самый изящный путь, содержит ли тот объектный массив определенное значение?
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
Если вы должны делать этот поиск часто, я думаю, что не удобно писать LINQ-выражение каждый раз. Я бы написал расширение-метод вот так:
private static bool ContainsValue(this List<DataRow> list, object value)
{
return list.Any(dataRow => dataRow["MyColumn"].Equals(value));
}
И после этого сделал бы поиск:
if (list.ContainsValue("Value"))
Возможно, я неправильно прочитал это, но похоже, что данные в настоящее время находятся в List
, а не в таблице данных, поэтому, чтобы получить элементы, соответствующие определенным критериям, вы могли бы сделать что-то вроде :
var matched = items.Where(objArray => objArray.Contains(value));
items будет вашим списком object []: s, а сопоставленным будет IEnumerable []> с объектом []: s со значением в.
Ну, это зависит от того, на какой версии 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 и выше.
http://dotnetperls.com/list-find-methods есть кое-что о exists & find.