Periksa apakah daftar kosong di C # [tertutup]


125

Saya memiliki daftar objek yang dihuni dari database. Saya perlu menampilkan pesan kesalahan jika daftar kosong dan menampilkan tampilan kisi sebaliknya.

Bagaimana cara memeriksa apakah a List<T>kosong di C #?


9
Jadi apa salahnya menggunakan if (list.Count == 0) { /* ... */ }?
Bart van Nierop

11
Atauif (!list.Any())
Sejak

10
Tidak dapat memahami mengapa pertanyaan ini Diturunkan. Bagi saya itu sangat spesifik (DAFTAR BENDA). Tidak ada yang "Tidak Jelas" di sini. Pertanyaan ini telah dilihat lebih dari 30k. +1
MarceloBarbosa

2
Pertanyaan itu masuk akal. "Saya perlu menampilkan pesan kesalahan jika daftar kosong". Ingat dalam komunikasi manusia, tidak setiap karakter penting.
Todd Painton

9
Ini juga merupakan hasil Google # 1 C# list isemptyyang benar-benar tepat. Saya pikir bagian yang tidak relevan dari pertanyaan harus diedit, dan saya memberikan suara untuk membuka kembali.
Felix Dombek

Jawaban:


142

Kenapa tidak...

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

The GridViewmemiliki juga EmptyDataTemplateyang ditampilkan jika sumber data kosong. Ini adalah pendekatan di ASP.NET:

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

<emptydatatemplate>

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

    No Data Found!  

</emptydatatemplate> 

2
Catatan: pendekatan kedua menganggap ASP.NET.
Tim Schmelter

2
Bukankah lebih baik memeriksa list == nullterlebih dahulu?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

2
@ ᴍᴀᴛᴛʙᴀᴋᴇʀ, var someList = Daftar baru <string> (); akan dibuat instance-nya (dan karenanya tidak menjadi null) tetapi akan kosong dari elemen yang akan diproses
daviesdoesit

74

Jika implementasi daftar yang Anda gunakan adalah IEnumerable<T>dan LINQ adalah sebuah opsi, Anda dapat menggunakan Any:

if (!list.Any()) {

}

Jika tidak, biasanya Anda memiliki Lengthatau Countproperti pada array dan tipe koleksi masing-masing.


10
Sebagai catatan singkat: daftar. Setiap memiliki kinerja yang jauh lebih baik daripada menghitung.
Adrian Lopez

2
@AdrianLopez: bisakah Anda menjelaskannya? Jika Anda memiliki .Countatau .Lengthproperti seperti Listapa yang bisa .Any()dilakukan untuk lebih cepat daripada memeriksa properti dari koleksi yang melacak panjang atau hitungan saat ini? Jika Anda hanya memiliki Enumerator, .Any()tentu saja lebih cepat dari .Count() > 0. Lihat juga: stackoverflow.com/questions/305092/… atau stackoverflow.com/questions/5741617/…
noox

2
@noox Melihat sumber (.Net Core), tampaknya Anymemeriksa untuk memvalidasi bahwa mengambil penghitungan itu murah sebelum mengujinya, dalam kasus di mana Anda memiliki IListProvider<>yang tidak melacak penghitungan, itu akan menghitung sekali sebagai gantinya.
NetMage

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

Anda dapat membuat datagrid Anda terlihat salah dan membuatnya terlihat di bagian lain.


@NetMage Itu bukan cara kerjanya untuk daftar. Ini adalah O(1)operasi dan tidak ada iterasi yang dilakukan untuk menghitung elemen. Lihat List<T>.Count.
Spencer Wieczorek

@SpencerWieczorek Anda benar, komentar itu sudah tua dan juga salah :) Meskipun secara umum, saya masih lebih suka Any()mengungkapkan niat dengan lebih baik, serta lebih berkinerja ketika Anda tidak tahu bahwa Anda memiliki yang sebenarnya List<T>.
NetMage

18

Bagaimana dengan menggunakan Countproperti.

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

3
Menghitung adalah properti bukan metode
Muslim Ben Dhaou

5
@MoslemBenDhaou Tergantung pada apakah metode ekstensi Linq diekspos / dipanggil, atau asli objek.
Berikan Thomas

@GrantThomas Saya menganggapnya sebagai objek Daftar <T> tetapi ya Anda benar.
Muslim Ben Dhaou

bagaimana jika listOfObjects adalah null?
Sabri Meviş

2
@ SabriMeviş koleksi / ienumerable / daftar dikembalikan dari metode seharusnya tidak pernah null. Ini harus menjadi koleksi kosong sebagai gantinya.
Jeroen van Langen

8

Anda harus menggunakan IFpernyataan sederhana

List<String> data = GetData();

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

PopulateGrid();
ShowGrid();

IMO cara paling sederhana dan terbaik.
Jabba

Jika metode tersebut mengembalikan null, properti Count akan gagal. Untuk menjaga kode tetap ringkas, pertimbangkan operator cek referensi null "?". Contoh "jika (data? .Count == 0). ....." atau centang nol klasik "if (data! = null && someOtherCondition) ....."
daviesdoesit

Tempel kode berikut ke dalam dotnetfiddle dan Anda akan melihat System.NullReferenceException: Referensi objek tidak disetel ke instance objek. 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 sendiri memiliki metode yang memeriksa apakah sumber data yang Anda ikat kosong, memungkinkan Anda menampilkan sesuatu yang lain.


0

Jika Anda menggunakan gridview, gunakan template data kosong: 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>

Ini sangat spesifik ASP.NET.
Berikan Thomas

Saya bukan orang winforms tetapi bukan spesifik gridview asp.net. Ini adalah tampilan datagrid dalam bentuk?
David MacCrimmon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.