在 List<DataRow> 中搜索?

Posted

技术标签:

【中文标题】在 List<DataRow> 中搜索?【英文标题】:Search in a List<DataRow>? 【发布时间】:2011-03-03 21:13:44 【问题描述】:

我有一个从 DataTabe 创建的列表,其中只有一列。假设该列名为 MyColumn。列表中的每个元素都是一个包含我的列的对象数组,在这种情况下,只有一个 (MyColumn)。检查该对象数组是否包含某个值的最优雅的方法是什么?

【问题讨论】:

【参考方案1】:

我可能误读了此内容,但似乎数据当前位于 List&lt;object[]&gt; 中而不是数据表中,因此要获取符合特定条件的项目,您可以执行以下操作:

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

items 将是您的 object[]:s 列表,matched 将是一个 IEnumerable[]> 与 object[]:s 的值。

【讨论】:

【参考方案2】:

嗯,这取决于您使用的 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 的一段代码中的一个问题。基本上我是在枚举一个不再有效的成员序列。

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

【讨论】:

【参考方案3】:

如果你要经常做这个搜索,我觉得每次都写LINQ-expression不太方便。我会这样写扩展方法:

private static bool ContainsValue(this List<DataRow> list, object value)

    return list.Any(dataRow => dataRow["MyColumn"].Equals(value));

然后进行搜索:

if (list.ContainsValue("Value"))

【讨论】:

【参考方案4】:
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

【讨论】:

【参考方案5】:

http://dotnetperls.com/list-find-methods 有关于存在和查找的内容。

【讨论】:

问题是,列表包含一个我需要搜索的数组......所以我想我不必搜索列表,而是列表中的数组。

以上是关于在 List<DataRow> 中搜索?的主要内容,如果未能解决你的问题,请参考以下文章

C#中的List<类名> 怎么理解?如把Datarow dr[0]=List<类名> 这怎么理解?

如何使用 StreamBuilder 消除颤振数据表错误“预期类型为 'List<DataRow>',但得到类型为 'List<dynamic>”的值之一?

C# list<>根据对象的某个属性排序

List<t> 集合中的选择方法

将 DataTable 转换为通用列表?

将 dataRow 转移到新数据集