2012-04-11 52 views
0

請問有人幫我在LINQ寫這個值,LINQ的方式找到DataTable中

DataTable dt = new DataTable(); 

      DataColumn dcValue = new DataColumn(); 
      dcValue.ColumnName = "value"; 

      DataColumn dvDisplay = new DataColumn(); 
      dvDisplay.ColumnName = "display"; 

      DataColumn dvIsDefualt = new DataColumn(); 
      dvIsDefualt.ColumnName = "isDefalt"; 

      dt.Columns.Add(dcValue,int); 
      dt.Columns.Add(dvDisplay,string); 
      dt.Columns.Add(dvIsDefualt,bool); 

      this.tipRacuna.DataSource = ds.Tables[0]; 
      this.tipRacuna.ValueMember = "value"; 
      this.tipRacuna.DisplayMember = "display"; 

      this.tipRacuna.SelectedValue = findDefault(dt);//linq to find first value with default = true;  


     } 
     private int findDefault(DataTable dtt) 
      { 
       int i= 0; 

      foreach (DataRow dr in dtt.Rows) 
      { 
       if (bool.Parse(dr["isDefalt"].ToString())) 
       { 
        return int.Parse(dr["value"].ToString()); 
       } 
      } 
       return i; 
      } 

隨着我越來越多地參與C#和編程可言,我得到的LINQ查詢更多野趣。
在開始我總是跳過LINQ參數,因爲我知道TSQL不需要另一個查詢語言,但是當我看到有多少行代碼可以使用LINQ保存時,我開始學習它。

+0

由於'isDefault'是一個bool,爲什麼得到的字符串值,解析它?你可以將它投射到布爾並完成。 'value'作爲int列也是一樣。解析不是一個超級便宜的操作,而是鑄造。 – Servy 2012-04-11 14:57:34

+0

@Servy編譯器不會讓我繼續下去,如果我不解析它到布爾,我同意你,我應該嘗試一些東西,然後我才尋求幫助。但我的第一步是開始尋找可以使用LINQ作爲選項的方式。 – adopilot 2012-04-11 15:00:57

+0

你找到了一個。 LINQ是這裏的一個選項。現在,你已經失去了大部分可能的學習機會,因爲其他人只是給你提供了完整的解決方案。如果你在這方面工作了一段時間,但仍然沒有提出任何建議,那麼詢問在這裏使用Linq是否可行或適當可能是有用的,而不是尋求解決方案。 – Servy 2012-04-11 15:03:32

回答

7

假設您的數據庫列的強類型(最佳):

dtt.AsEnumerable().Where(dr => dr.Field<bool>("isDefault")) 
    .Select(dr => dr.Field<int>("value")).FirstOrDefault(); 

隨着類型轉換:

dtt.AsEnumerable().Where(dr => Convert.ToBoolean(dr["isDefault"])) 
    .Select(dr => Convert.ToInt32(dr["value"])).FirstOrDefault(); 

隨着解析:

dtt.AsEnumerable().Where(dr => bool.Parse(dr["isDefault"].ToString())) 
    .Select(dr => int.Parse(dr["value"].ToString())).FirstOrDefault(); 

請注意,我有將「isDefalt」的拼寫更正爲「isDefault」。

+0

你錯過了'.FirstOrDefault()'。 – Servy 2012-04-11 14:58:04

+0

它看起來像DataTable中的所有列都是字符串,即它包含「true」,「false」,所以'dr.Field '將會失敗。醜陋! – ColinE 2012-04-11 14:59:47

+0

我的不好 - 這是一個布爾專欄。 – ColinE 2012-04-11 15:00:55

1

我想這大概是你所追求的:

dtt.AsEnumerable() 
    // find items that match your 'if' condition 
    .Where(dr => bool.Parse(dr["isDefalt"].ToString())) 
    // perform your int parse 
    .Select(dr => int.Parse(dr["value"].ToString())) 
    // take the first result 
    .FirstOrDefault(); 
+0

上面的實現實際上是'FirstOrDefault',而不是'First'。如果沒有默認行,它將返回0。 – Servy 2012-04-11 14:58:55

+0

@Servy是的,剛剛發現。修復 :-) – ColinE 2012-04-11 15:00:22