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 #?

lakshganga
sumber
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> 
Tim Schmelter
sumber
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.

Berikan Thomas
sumber
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.

Kuzgun
sumber
@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();
 }
Jeroen van Langen
sumber
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();
Muslim Ben Dhaou
sumber
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
TalentTuner
sumber
3

gridview sendiri memiliki metode yang memeriksa apakah sumber data yang Anda ikat kosong, memungkinkan Anda menampilkan sesuatu yang lain.

Baahubali
sumber
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>
David MacCrimmon
sumber
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