SORU
22 EKİM 2010, Cuma


Sıra eşleşen bir öğe içeriyor

Veri işleme için seri kullanıyorum ASP.NET bir uygulama var. Çalışırken, istisna olsun "Sıra eşleşen hiçbir öğe içeriyor".

if (_lstAcl.Documents.Count > 0)
{
    for (i = 0; i <= _lstAcl.Documents.Count - 1; i  )
    {
        string id = _lstAcl.Documents[i].ID.ToString();                           
        var documentRow = _dsACL.Documents.First(o => o.ID == id);
        if (documentRow !=null)
        {

            _lstAcl.Documents[i].Read = documentRow.Read;
            _lstAcl.Documents[i].ReadRule = documentRow.ReadRule;

            _lstAcl.Documents[i].Create= documentRow.Create;
            _lstAcl.Documents[i].CreateRule = documentRow.CreateRule;

            _lstAcl.Documents[i].Update = documentRow.Update;
            _lstAcl.Documents[i].UpdateRule = documentRow.UpdateRule;

            _lstAcl.Documents[i].Delete = documentRow.Delete;
            _lstAcl.Documents[i].DeleteRule = documentRow.DeleteRule;
        }
    }
}

CEVAP
22 EKİM 2010, Cuma


Bu özel durum üretiliyor bu replik beklerdim:

var documentRow = _dsACL.Documents.First(o => o.ID == id)

First() eğer eşleşen tüm öğeleri bulabilirsiniz, bir özel durum oluşturur. Vermiş olduğun test için boş hemen ardından geliyor gibi istediğiniz FirstOrDefault() döndüren, varsayılan değeri öğe türü (null başvuru türleri) eğer eşleşen hiçbir öğe buldu

var documentRow = _dsACL.Documents.FirstOrDefault(o => o.ID == id)

Bazı durumlarda diğer seçenekleri düşünmeye Single() tam olarak eşleşen bir unsur var sana inanıyorum (zaman) ve SingleOrDefault() tam veya sıfır eşleşen öğeleri bir tane var sana inanıyorum (zaman). FirstOrDefault Bu durumda en iyi seçenek olduğunu sanıyorum, ama değer diğerleri hakkında bilmek zaten.

Diğer yandan, aslında ilk olarak buraya katılması ile daha iyi olabilir gibi görünüyor. Ne olacağı umurunda değilditümmaçlar (daha ilk) kullanabilirsiniz:

var query = from target in _lstAcl.Documents
            join source in _dsAcl.Document
            where source.ID.ToString() equals target.ID
            select new { source, target };
foreach (var pair in query)
{
    target.Read = source.Read;
    target.ReadRule = source.ReadRule;
    // etc
}

Bu kadar basit bir iş değilvedaha verimli IMO.

Sana bileyapındöngü devam etmeye karar, bir çift önerim var:

  • if dış kurtulmak. Eğer Saymak için döngü bloğu hiç yürütecek sıfırsa olarak ihtiyacın yok
  • C daha deyimsel onlar özel üst sınırları döngüler için kullanılan -#:

    for (i = 0; i < _lstAcl.Documents.Count; i  )
    
  • Ortak taşıyıcının ortadan kaldırmak

    var target = _lstAcl.Documents[i];
    // Now use target for the rest of the loop body
    
  • Mümkünse foreach yerine for ile başlayın:

    foreach (var target in _lstAcl.Documents)
    

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Carlos Delgado

    Carlos Delga

    21 HAZİRAN 2011
  • Fr. Eckle Studios

    Fr. Eckle St

    29 Kasım 2006
  • parlophone

    parlophone

    28 ŞUBAT 2006