2010-10-12 16 views
6
public ActionResult Create(FormCollection collection, FormCollection formValue) 
{ 
    try 
    { 
     Project project = new Project(); 

     TryUpdateModel(project, _updateableFields); 

     var devices = collection["devices"]; 
     string[] arr1 = ((string)devices).Split(','); 
     int[] arr2 = Array.ConvertAll(arr1, s => int.Parse(s)); 

     project.User = SessionVariables.AuthenticatedUser; 
     var time = formValue["Date"]; 
     project.Date = time; 
     project.SaveAndFlush(); 

     foreach (int i in arr2) 
     { 
      Device d = Device.Find(i); 
      d.Projects.Add(project); 
      d.SaveAndFlush(); 
     } 

     return RedirectToAction("Index"); 
    } 
    catch (Exception e) 
    { 
     return View(e); 
    } 
} 

Ich möchte die foreach in einer if-Anweisung wickeln, die überprüft, obÜberprüfen Sie, ob Sammlung leer ist oder nicht

var devices = collection["devices"]; 

leer ist oder nicht. Wenn es leer ist, sollte das für jedes nicht ausgeführt werden. Für den Datensatz ist Sammlung ["Geräte"] eine Sammlung von Kontrollkästchenwerten aus einem Formular.

Antwort

6

Sie müssen nicht überprüfen, ob die Sammlung leer ist, wenn sie leer ist, wird der Code im ForEach nicht ausgeführt, siehe mein Beispiel unten.

using System; 
using System.Collections.Generic; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<string> emptyList = new List<string>(); 

      foreach (string item in emptyList) 
      { 
       Console.WriteLine("This will not be printed"); 
      } 

      List<string> list = new List<string>(); 

      list.Add("item 1"); 
      list.Add("item 2"); 

      foreach (string item in list) 
      { 
       Console.WriteLine(item); 
      } 

      Console.ReadLine(); 
     } 
    } 
} 
+0

Ja, tut mir leid, ich bin ein Idiot. Habe den Fehler, den ich beim Versuch einer if-Anweisung bekommen habe, falsch gelesen. Es wurde nicht dadurch verursacht, dass der Forearch versuchte, eine leere Sammlung zu durchlaufen. Setzen Sie die Umwandlung in das int-Array innerhalb der if-Anweisung, um sie zu lösen. – Prd

13

Sie können das Count Feld überprüfen, ob die Sammlung leer ist oder nicht

so werden Sie mit etwas am Ende wie folgt:

if(devices.Count > 0) 
{ 
    //foreach loop 
} 
+0

Ja, ich habe es tatsächlich versucht, aber es gibt mir einen Fehler: Fehler 1 'String' enthält keine Definition für 'Count' und keine Erweiterungsmethode 'Count' akzeptiert ein erstes Argument vom Typ 'String' könnte gefunden werden (fehlt eine using-Direktive oder eine Assembly-Referenz?) – Prd

+0

Try Count() https://msdn.microsoft.com/en-us/library/vstudio/bb338038%28v=vs.100%29.aspx wie ich denke FormCollection ist IEnumerable – danio

0

Wie über die Array-Länge Überprüfung

if (arr2.length > 0) 
{ 
    foreach (int i in arr2) 
    { 
     Device d = Device.Find(i); 
     d.Projects.Add(project); 
     d.SaveAndFlush(); 
    } 
} 
+0

gibt mir den gleichen Fehler:/ – Prd

+0

dann var Geräte gibt nicht den Typ, den Sie erwarten. – Roadie57

+0

Wenn Leute 'var' nicht benutzen, wären die meisten viel glücklicher ... –

1

Ihr Code, so wie er steht, wird nicht funktionieren, da Sie sagen, dass collection["devices"] eine Sammlung von Checkbox-Werten ist und Sie es dennoch in eineumwandeln. Meinst du collection ist das Kontrollkästchen Werte? Was ist der genaue Typ von collection?

Jedes Objekt, das ICollection oder ICollection<T> implementiert, kann überprüft werden, ob es leer ist oder nicht, indem überprüft wird, ob die Eigenschaft Count größer als Null ist.

+0

ist eine Formsammlung. Ich konvertiere es in ein int-Array, damit die Werte verarbeitet werden können. Ich habe den Code aktualisiert, um die gesamte Aktion so anzuzeigen, wie sie jetzt ist. Dieser Code funktioniert, solange Sie mindestens 1 Kontrollkästchen auswählen, bei dem es sich um das Problem handelt. – Prd

+0

formcollection gibt nur Steuerelemente zurück, die Daten enthalten. das ist normales Verhalten – Roadie57

5

Sie können die Methode verwenden Any wenn eine Sammlung wie jedes Element kennen.

if (devices.Any()) 
{ 
    //devices is not empty 
} 
+0

Any() ist eine LINQ-Methode und gibt Ihnen zu viel Aufwand für eine solche einfache Überprüfung. Zählen Sie vorzugsweise Count oder Length, wenn Ihre Sammlung nicht IEnumerable ist –

Verwandte Themen