2010-10-12 25 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); 
    } 
} 

Quiero envolver el foreach en una sentencia if que comprueba siComprobar si la colección está vacía o no

var devices = collection["devices"]; 

está vacía o no. Si está vacío, no se debe ejecutar para cada uno. Para el registro, la colección ["dispositivos"] es una colección de valores de casilla de verificación de un formulario.

Respuesta

6

No necesita comprobar si la colección está vacía; si está vacía, el código dentro de ForEach no se ejecutará, vea mi ejemplo a continuación.

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

Sí, lo siento, soy un idiota. Leí mal el error que tuve al intentar una declaración if. No fue causado por el forearca que intentaba recorrer una colección vacía. poner la conversión a la matriz int dentro de la instrucción if lo resuelve. – Prd

13

Usted puede utilizar el campo Count para comprobar si la colección está vacía o no

por lo que va a terminar con algo como esto:

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

sí He intentado realmente eso, pero me da un error: Error 1 'cadena' no contiene una definición de 'Count' y 'Count' ningún método de extensión aceptar un primer argumento de tipo 'cadena' se puede encontrar (¿falta una directiva using o una referencia de ensamblado?) – Prd

+0

Try Count() https://msdn.microsoft.com/en-us/library/vstudio/bb338038%28v=vs.100%29.aspx como creo que FormCollection es IEnumerable, – danio

0

¿Qué hay de comprobar la longitud de la matriz

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

me da el mismo error:/ – Prd

+0

luego var devices no devuelve el tipo esperado. – Roadie57

+0

Si la gente no estuviera usando 'var', la mayoría sería mucho más feliz ... –

1

Su código, tal como está, no funcionará, ya que dice que collection["devices"] es una colección de valores de casilla de verificación, y aún así lo está enviando a un string. ¿Quieres decir collection son los valores de la casilla de verificación? ¿Cuál es el tipo exacto de collection?

Cualquier objeto que implemente ICollection o ICollection<T> se puede comprobar si está vacío o no verificando si la propiedad Count es mayor que cero.

+0

es un formcollection. Lo estoy convirtiendo en una matriz int para que los valores puedan ser procesados. He actualizado el código para mostrar toda la acción tal como está ahora. Este código funciona siempre que seleccione al menos 1 casilla de verificación, que es el problema. – Prd

+0

formcollection solo devuelve controles que contienen datos. eso es comportamiento normal – Roadie57

5

Usted puede utilizar el método Any para saber si una colección como cualquier elemento.

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

Cualquiera() es un método LINQ y le da demasiada sobrecarga para una comprobación tan simple. Prefiere Count o Length insted si tu colección no es IEnumerable –

Cuestiones relacionadas