2010-06-15 80 views
8

我有一个列表,我从一个只有一列的DataTabe创建。比方说这个专栏叫做MyColumn。列表中的每个元素都是包含我的列的对象数组,在这种情况下,只有一个(MyColumn)。最优雅的方法来检查该对象数组是否包含特定值?从列表中查找<DataRow>?

回答

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 
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; 

这将使匹配你两排和一个布尔它告诉你是否找到任何东西。

但是,如果你没有LINQ或随之而来的扩展方法,你将不得不寻找列表中的“旧派”:

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。

0

如果您经常进行此搜索,我认为每次写LINQ-expression都不方便。我会写扩展,方法是这样的:

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

,以及使搜索后:

if (list.ContainsValue("Value")) 
0

我可能误解这一点,但它似乎像数据目前处于List<object[]>而不是在数据表因此要获得符合特定条件,你可以做这样的事情的项目:

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

项目将是你的对象[]的列表:S和匹配的将是一个IEnumerable []>与对象[]:小号与值

+0

不,它在列表其中包含一个对象数组... – grady 2010-06-15 14:53:38