C # 'da listenin boş olup olmadığını kontrol edin [kapalı]


125

Bir veritabanından doldurulan nesnelerin bir listesi var. Liste boşsa bir hata mesajı görüntülemem ve aksi takdirde bir kılavuz görünümü görüntülemem gerekiyor.

List<T>C # 'da a'nın boş olup olmadığını nasıl kontrol ederim ?


9
Peki kullanmanın nesi yanlış if (list.Count == 0) { /* ... */ }?
— Bart van Nierop

11
Veyaif (!list.Any())
— Tharwen

10
Bu soruya neden olumsuz oy verildiğini anlayamıyorum. Benim için çok özel (NESNELER LİSTESİ). Burada "belirsiz" hiçbir şey yok. Bu sorunun 30 binden fazla görünümü var. +1
— MarceloBarbosa

2
Soru çok mantıklı. "Liste boşsa bir hata mesajı görüntülemem gerekiyor". İnsan iletişiminde her karakterin bir önemi olmadığını unutmayın.
— Todd Painton

9
Bu aynı zamanda C# list isemptytamamen yerinde olduğu 1 numaralı Google sonucudur . Sorunun alakasız kısımlarının düzeltilmesi gerektiğini düşünüyorum ve yeniden açmak için oy veriyorum.
— Felix Dombek

Yanıtlar:


143

Neden olmasın...

bool isEmpty = !list.Any();
if(isEmpty)
{
    // error message
}
else
{
    // show grid
}

Veri kaynağı boşsa gösterilen GridViewbir de vardır EmptyDataTemplate. Bu, ASP.NET'te bir yaklaşımdır:

<emptydatarowstyle backcolor="LightBlue" forecolor="Red"/>

<emptydatatemplate>

  <asp:image id="NoDataErrorImg"
    imageurl="~/images/NoDataError.jpg" runat="server"/>

    No Data Found!  

</emptydatatemplate> 

2
Not: ikinci yaklaşım ASP.NET'i varsayar.
— Tim Schmelter

2
list == nullÖnce kontrol etmek en iyisi olmaz mıydı ?
— ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

2
@ ᴍᴀᴛᴛʙᴀᴋᴇʀ, bazıListe var = yeni Liste <dize> (); örneklenecek (ve bu nedenle boş olmayacak), ancak işlenecek öğeler
— içermeyecek

74

IEnumerable<T>Kullandığınız liste uygulaması ise ve Linq bir seçenekse, şunları kullanabilirsiniz Any:

if (!list.Any()) {

}

Aksi takdirde, genellikle sırasıyla dizilerde ve koleksiyon türlerinde bir Lengthveya Countözelliğiniz vardır.


10
Hızlı bir not: list.Any saymaktan çok daha iyi performansa sahiptir.
— Adrian Lopez

2
@AdrianLopez: Bunu detaylandırır mısın? Bir .Countveya .Lengthmülkünüz varsa , mevcut uzunluğu veya sayıyı takip eden koleksiyonun özelliğini kontrol etmekten daha hızlı Listolabilecek ne olabilir .Any()? Yalnızca bir Numaralandırıcınız varsa, o zaman .Any()elbette bundan daha hızlıdır .Count() > 0. Ayrıca bkz .: stackoverflow.com/questions/305092/… veya stackoverflow.com/questions/5741617/…
— noox

2
@noox (.Net Core) kaynağına bakıldığında, sayımın Anytest edilmeden önce alınmasının ucuz olduğunu doğrulamak için kontrol ediliyor gibi görünüyor , sayımı IListProvider<>izlemeyen bir hesabınız varsa, bunun yerine bir kez numaralandıracaktır.
— NetMage

26
    If (list.Count==0){
      //you can show your error messages here
    } else {
      //here comes your datagridview databind 
    }

Datagrid'inizi yanlış görünür yapabilir ve else bölümünde görünür yapabilirsiniz.


@NetMage Liste için böyle çalışmıyor. Bu bir O(1)işlemdir ve öğeleri saymak için hiçbir yineleme yapılmaz. Bakın List<T>.Count.
— Spencer Wieczorek

@SpencerWieczorek Doğru söylüyorsunuz, bu yorum eski olduğu kadar yanlıştı :) Genel Any()olarak niyetimi daha iyi ifade etmeyi ve bir gerçek olduğunu bilmediğinizde daha performanslı olmayı tercih ederim List<T>.
— NetMage

18

CountMülkü kullanmaya ne dersiniz ?

 if(listOfObjects.Count != 0)
 {
     ShowGrid();
     HideError();
 }
 else
 {
     HideGrid();
     ShowError();
 }

3
Sayım bir yöntem değil bir özelliktir
— Moslem Ben Dhaou

5
@MoslemBenDhaou Linq genişletme yönteminin maruz bırakılması / çağrılması veya nesneye özgü olmasına bağlıdır.
— Grant Thomas

@GrantThomas Bunu Liste <T> nesnesi olarak aldım ama evet haklısınız.
— Moslem Ben Dhaou

ya listOfObjects boşsa?
— Sabri Meviş

2
@ SabriMeviş bir yöntemden dönen bir koleksiyon / ienumerable / liste asla olmamalıdır null. Bunun yerine boş bir koleksiyon olmalıdır.
— Jeroen van Langen

8

Basit bir IFifade kullanmalısın

List<String> data = GetData();

if (data.Count == 0)
    throw new Exception("Data Empty!");

PopulateGrid();
ShowGrid();

En basit ve en iyi yol IMO.
— Jabba

Yöntem bir null döndürürse, Count özelliği başarısız olur. Kodu kısa ve öz tutmak için, boş referans denetimi "?" Operatörünü düşünün. Örnek "if (data? .Count == 0)....." veya klasik boş kontrol "eğer (data! = null && someOtherCondition) ....."
— daviesdoesit

Aşağıdaki kodu bir dotnetfiddle'a yapıştırın ve System.NullReferenceException: Nesne başvurusu bir nesnenin bir örneğine ayarlanmadı. using System; using System.Collections.Generic; public class Program { public static void Main() { List<string> stringList = null; if (stringList.Count == 0) { Console.WriteLine("no items in collection"); } } }
— daviesdoesit

6
var dataSource = lst!=null && lst.Any() ? lst : null;
// bind dataSource to gird source

3

gridview, onu bağladığınız veri kaynağının boş olup olmadığını kontrol eden bir yönteme sahiptir, başka bir şeyi görüntülemenize izin verir.


0

Bir ızgara görünümü kullanıyorsanız, boş veri şablonunu kullanın: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.emptydatatemplate.aspx

      <asp:gridview id="CustomersGridView" 
        datasourceid="CustomersSqlDataSource" 
        autogeneratecolumns="true"
        runat="server">

        <emptydatarowstyle backcolor="LightBlue"
          forecolor="Red"/>

        <emptydatatemplate>

          <asp:image id="NoDataImage"
            imageurl="~/images/Image.jpg"
            alternatetext="No Image" 
            runat="server"/>

            No Data Found.  

        </emptydatatemplate> 

      </asp:gridview>

Bu çok ASP.NET'e özgüdür.
— Grant Thomas

Winforms adamı değilim ama gridview asp.net'e özgü değilim. Formlarda bir veri görünümü mü?
— David MacCrimmon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.