2012-04-11 7 views
0

Darf ich jemanden bitten, mir zu helfen, schreibe dies in LINQ,Linq Art und Weise in Wert zu finden 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; 
      } 

Wie ich in C# und Programmierung überhaupt mehr beteiligt bin immer, ich bin immer mehr interessant in LINQ-Abfragen .
In beginnt ich LINQ immer Argument zu überspringen, da ich TSQL keine Notwendigkeit für eine andere Abfrage Sprache weiß, aber wenn ich sehe, wie viele Zeilen Code ich mit LINQ speichern kann, beginne ich es zu lernen.

+0

Seit 'isDefault' ist ein Bool, warum den String-Wert erhalten und es analysieren? Sie können es einfach auf einen Booler werfen und fertig sein. Dasselbe gilt für "Wert" als eine int-Spalte. Parsen ist keine super billige Operation, Casting ist. – Servy

+0

@Servy Compiler wird mich nicht weitermachen lassen, wenn ich es nicht bole, ich stimme Ihnen zu, dass ich etwas versuchen sollte, bevor ich um Hilfe bat. Aber mein erster Schritt ist, einen Weg zu finden, wo ich LINQ als Option verwenden kann. – adopilot

+0

Und du hast eins gefunden. LINQ ist hier eine Option. Jetzt haben Sie den größten Teil der möglichen Lerngelegenheit verloren, es herauszufinden, weil andere Ihnen einfach die vollständige Lösung gegeben haben. Hatten Sie eine Weile daran gearbeitet und haben immer noch nichts gefunden, dann zu fragen, ob es überhaupt möglich oder sinnvoll ist, Linq zu benutzen, könnte hilfreich gewesen sein, anstatt nach einer Lösung zu fragen. – Servy

Antwort

7

Unter der Annahme, dass Ihre DB-Spalten stark typisiert (am besten):

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

Mit Typumwandlung:

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

Mit Analyse:

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

Anmerkung, die ich habe Die Schreibweise von "isDefalt" wurde auf "isDefault" korrigiert.

+0

Sie verpassen eine '.FirstOrDefault()'. – Servy

+0

Es sieht so aus, als ob alle Spalten in der DataTable Strings sind, d. H. Es enthält "true", "false", so dass 'dr.Field ' fehlschlägt. Hässlich! – ColinE

+0

Mein Schlechter - es ist eine Bool-Spalte. – ColinE

1

Ich denke, das grob ist, was Sie nach:

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

Die obige Implementierung ist effektiv "FirstOrDefault", nicht "First". Es gibt 0 zurück, wenn keine Standardzeile vorhanden ist. – Servy

+0

@Servy yep, habe gerade das entdeckt. Behoben :-) – ColinE

Verwandte Themen