2013-08-06 2 views
0

Предположим, у меня есть 2 DataTables, DSALL и DSSome для хранения информации студентПроверьте, существуют ли конкретные данные в DataTable

DSALL (магазин вся информация студент)

SID (PK)
Имя
Адрес
Телефон
...

DSSome (Хранить только SID для некоторых конкретных студентов)

SID (Unique)

Теперь я хочу C# функция, чтобы проверить все SID в DSSome существуют в DSALL. Функция возвращает true, если все SID существует в DSALL, возвращает false, если в противном случае.

Традиционный способ

protected bool checkSID(DataTable DSALL, DataTable DSSome){ 
    for (int i=0; i<DSSome.Rows.Count; i++){ 
    bool isFound = false; 
    string SID = DSSome.Rows[i]["SID"].ToString(); 
    for (int j=0; j<DSALL.Rows.Count; j++){ 
     string _SID = DSALL.Rows[j]["SID"].ToString(); 
     if (SID == _SID) { isFound = true; break; } 
    } 
    if (!isFound) return false; 
    } 
    return true; 
} 

Есть ли какой-либо другой простой способ эффективный способ решить эту проблему?

+1

Вы можете использовать [DataTable.Select] (http://msdn.microsoft.com/en-us/library/det4aw50.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet -2) для замены внутреннего цикла - DataRow [] rows = DSALL.Select ("SID =" + _SID); if (rows.Length> 0) {isFound = true; } '. LINQ может быть более эффективным для чтения, но я не знаю, действительно ли это будет * более эффективным. – Tim

ответ

1

Вот еще один вариант. Он захватывает все идентификаторы SID из DSSOME, , за исключением тех, которые встречаются в DSALL. Если в DSSOME есть какие-либо значения, которые не существуют в DSALL, .Any() вернет true.

Тогда вы можете просто отрицать значение, так как вы хотели вернуть true, если не были любые значения, оставшиеся в DSSOME.

return !DSSome.Rows.Cast<DataRow>().Select(x => x["SID"]) 
       .Except(DSALL.Rows.Cast<DataRow>().Select(x => x["SID"])).Any(); 
+0

Это также приемлемое решение. Спасибо за вашу помощь! – Pang

1
return DSSome.Rows.OfType<DataRow>() 
     .All(r => DSAll.Rows.OfType<DataRow>() 
     .Where(x => (string)x["SID"] == (string)r["SID"]).Count() == 1) 

Это использование запроса linq для сравнения значений двух наборов. OfType <> используется для преобразования коллекции строк в Rows<DataRow> для использования LINQ. All() вернет true, если все строки удовлетворяют критериям. В противном случае он возвращает false.

+1

Добавление объяснения **, что ** код делает очень полезным для будущих читателей этого вопроса. – Tim

+0

Хорошо, я добавил объяснение – TGH

+0

Это работает! Спасибо за ваше решение! – Pang

Смежные вопросы