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.