2010-06-15 31 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