在List <datarow>?</datarow>中搜索

时间:2010-06-15 08:28:51

标签: c# list linq datatable contains

我有一个List,它是从DataTabe创建的,其中只有一列。可以说该列名为 MyColumn 。列表中的每个元素都是一个包含我的列的对象数组,在本例中只有一个(MyColumn)。什么是最优雅的方法来检查该对象数组是否包含某个值?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

http://dotnetperls.com/list-find-methods有关于存在的事情&amp;找到。

答案 2 :(得分: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;

这将为您提供匹配的行和bool,告诉您是否发现任何行。

但是,如果你没有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的一个问题。基本上我是在列举一个不再有效的成员序列。

您可以通过C#2.0及更高版本中的iterators轻松创建自己的延迟IEnumebles。

答案 3 :(得分:0)

如果您经常进行此搜索,我认为每次编写LINQ表达式都不方便。我会像这样编写扩展方法:

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

然后进行搜索:

if (list.ContainsValue("Value"))

答案 4 :(得分:0)

我可能误解了这一点,但似乎数据目前位于List<object[]>而不是数据表中,因此要获得符合某些条件的项目,您可以执行以下操作:

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

项目将是您的对象[]:s列表,匹配将是IEnumerable []&gt;对象[]:s的值为。