2013-08-06 48 views
0

假設存在具體的數據我有2個數據表,DSALL和DSSome存儲的學生信息檢查是否在一個DataTable

DSALL(存儲所有學生信息)

SID(PK)
名稱
地址
電話
...

DSSome(僅存儲SID爲某些特定的學生)

SID(唯一)

現在我想一個C#函數,以檢查是否在所有DSSome在SID存在DSALL。如果DSALL中存在所有SID,則函數返回true,否則返回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

這是另一種選擇。它抓取DSSOME中的所有SID,,除了在DSALL中發生的。如果DSSOME中有任何DSALL中不存在的值,.Any()將返回true

然後,您可以僅僅否定該值,因爲如果不是 DSSOME中的任何剩餘值,則您想返回true

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