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

BenKontrol koleksiyon boş ya da değil

var devices = collection["devices"]; 

boş olup olmadığını kontrol eden bir eğer açıklamada foreach sarmak istiyorum. Her biri boşsa, idam edilmemelidir. Kayıt için koleksiyon ["devices"], bir formdaki onay kutusu değerlerinin toplamıdır. koleksiyon boş veya

yüzden böyle bir şey ile sona erecek değilse

cevap

6

Koleksiyonun boş olup olmadığını kontrol etmeniz gerekmez, boş ise ForEach içindeki kod çalıştırılmaz, aşağıdaki örneğe bakı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

Evet üzgünüm aptalım. If ifadesini denerken aldığım hatayı yanlış. Boş bir koleksiyonda aramaya çalışırken arama neden olmuyordu. if deyimindeki int dizisine dönüştürme işlemi çözer. – Prd

13

Sen kontrol etmek Count alanı kullanabilirsiniz:

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

Evet Aslında o denedim ama bana bir hata verir: Hata 1 'dizesi' 'Kont' ve hiçbir uzantı yöntemin 'Kont' türü 'dizesi' bir ilk argüman kabul için bir tanım içermiyor bulunabilir (kullanma yönergesi veya derleme başvurusu eksik misiniz?) – Prd

+0

Deneme Sayısı() https://msdn.microsoft.com/en-us/library/vstudio/bb338038%28v=vs.100%29.aspx Ben FormCollection IEnumerable – danio

0

Nasıl dizisi uzunluğunu

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

olduğunu düşünüyorum gibi bana aynı hatayı verir:/ – Prd

+0

sonra var cihazlar beklediğiniz türü döndürmüyor. – Roadie57

+0

Eğer insanlar 'var' kullanmıyorlarsa, çok daha mutlu olurlardı… –

1

collection["devices"], onay kutusu değerlerinin bir koleksiyonudur ve sizin de birürününe yayınladığınız anlamına gelir.. collection, onay kutusu değerleri mi demek istiyorsun? collection tam türü nedir?

ICollection veya ICollection<T>'u uygulayan tüm nesneler, Count özelliğinin sıfırdan büyük olup olmadığını kontrol ederek boş olup olmadığını kontrol edebilir.

+0

bir formcollection. Değerleri işlenebilmesi için bir int dizisine dönüştürüyorum. Tüm eylemi şimdi olduğu gibi göstermek için kodu güncelledim. Bu kod, sorun olan en az 1 onay kutusunu seçtiğiniz sürece çalışır. – Prd

+0

formcollection yalnızca veri içeren denetimleri döndürür. Bu normal davranış – Roadie57

5

yöntemden Any kullanabilirsiniz bilmek eğer herhangi bir öğe gibi bir koleksiyon.

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

Any() bir LINQ yöntemidir ve bu kadar basit bir kontrol için size çok fazla masraf verir. Koleksiyonunuz IEnumerable değilse Sayımı veya Uzunluk'u tercih edin. –