我有一个List,它是从DataTabe创建的,其中只有一列。可以说该列名为 MyColumn 。列表中的每个元素都是一个包含我的列的对象数组,在本例中只有一个(MyColumn)。什么是最优雅的方法来检查该对象数组是否包含某个值?
答案 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有关于存在的事情&找到。
答案 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的值为。