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

  • jkimisyellow

    jkimisyellow

    6 Mayıs 2009
  • Justin Case

    Justin Case

    3 EKİM 2011
  • spyib

    spyib

    9 Ocak 2007