Kiểm tra xem danh sách có trống trong C # không [đã đóng]


125

Tôi có một danh sách các đối tượng được điền từ cơ sở dữ liệu. Tôi cần hiển thị thông báo lỗi nếu danh sách trống và hiển thị chế độ xem lưới nếu không.

Làm cách nào để kiểm tra xem a List<T>có trống trong C # không?


9
Vậy có gì sai khi sử dụng if (list.Count == 0) { /* ... */ }?
Bart van Nierop

11
Hoặcif (!list.Any())
Tharwen

10
Không thể hiểu tại sao câu hỏi này đã bị Downvot. Đối với tôi, nó rất cụ thể (DANH SÁCH ĐỐI TƯỢNG). Không có gì "Không rõ ràng" ở đây. Câu hỏi này đã có hơn 30k lượt xem. +1
MarceloBarbosa

2
Câu hỏi có ý nghĩa hoàn hảo. "Tôi cần hiển thị thông báo lỗi nếu danh sách trống". Nên nhớ trong giao tiếp con người không phải tính cách nào cũng quan trọng.
Todd Painton

9
Đây cũng là kết quả số 1 của Google C# list isemptymà nó hoàn toàn đúng. Tôi nghĩ những phần không liên quan của câu hỏi nên được chỉnh sửa và tôi đang bỏ phiếu để mở lại.
Felix Dombek

Câu trả lời:


142

Tại sao không...

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

Cũng GridViewcó một EmptyDataTemplateđược hiển thị nếu nguồn dữ liệu trống. Đây là một cách tiếp cận trong ASP.NET:

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

<emptydatatemplate>

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

    No Data Found!  

</emptydatatemplate> 

2
Lưu ý: cách tiếp cận thứ hai giả định ASP.NET.
Tim Schmelter

2
Nó sẽ không phải là tốt nhất để kiểm tra xem list == nullđầu tiên?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

2
@ ᴍᴀᴛᴛʙᴀᴋᴇʀ, var someList = new Danh sách <string> (); sẽ được khởi tạo (và do đó không được null) nhưng sẽ có sản phẩm nào của các yếu tố đến quá trình
daviesdoesit

74

Nếu triển khai danh sách bạn đang sử dụng IEnumerable<T>và Linq là một tùy chọn, bạn có thể sử dụng Any:

if (!list.Any()) {

}

Nếu không, bạn thường có một Lengthhoặc thuộc Counttính trên mảng và loại tập hợp tương ứng.


10
Như lưu ý nhanh: list.Any có hiệu suất tốt hơn nhiều so với số lượng.
Adrian Lopez

2
@AdrianLopez: bạn có thể nói rõ hơn về điều đó không? Nếu bạn có một .Counthoặc thuộc .Lengthtính như với Listđiều gì có .Any()thể làm để nhanh hơn việc kiểm tra thuộc tính của tập hợp theo dõi độ dài hoặc số lượng hiện tại? Nếu bạn chỉ có một Điều tra viên, thì .Any()tất nhiên là nhanh hơn .Count() > 0. Xem thêm: stackoverflow.com/questions/305092/… hoặc stackoverflow.com/questions/5741617/…
noox

2
@noox Nhìn vào nguồn (.Net Core), có vẻ như các Anykiểm tra để xác thực rằng việc truy xuất số lượng là rẻ trước khi kiểm tra nó, trong trường hợp bạn có một IListProvider<>nguồn không theo dõi số lượng, thay vào đó, nó sẽ liệt kê một lần.
NetMage

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

Bạn có thể làm cho lưới dữ liệu của mình hiển thị sai và hiển thị nó trên phần khác.


@NetMage Đó không phải là cách nó hoạt động cho danh sách. Đó là một O(1)hoạt động và không có sự lặp lại nào được thực hiện để đếm các phần tử. Thấy chưa List<T>.Count.
Spencer Wieczorek

@SpencerWieczorek Bạn đúng, nhận xét đó cũ cũng như sai :) Mặc dù nói chung, tôi vẫn muốn Any()thể hiện ý định tốt hơn, cũng như tỏ ra hiệu quả hơn khi bạn không biết mình có thực tế List<T>.
NetMage

18

Còn về việc sử dụng Counttài sản.

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

3
Count là một tài sản không phải là một phương pháp
Hồi giáo Ben Dhaou

5
@MoslemBenDhaou Phụ thuộc vào việc đó là phương thức mở rộng Linq được hiển thị / được gọi hay là bản địa của đối tượng.
Grant Thomas,

@GrantThomas Tôi đã lấy nó làm đối tượng List <T> nhưng có bạn nói đúng.
thờ Hồi giáo Ben Dhaou

điều gì sẽ xảy ra nếu listOfObjects là null?
Sabri Meviş

2
@ SabriMeviş một tập hợp / ienumerable / danh sách được trả về từ một phương thức không bao giờ được null. Thay vào đó, nó phải là một bộ sưu tập trống.
Jeroen van Langen

8

Bạn nên sử dụng một IFcâu lệnh đơn giản

List<String> data = GetData();

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

PopulateGrid();
ShowGrid();

IMO cách đơn giản và tốt nhất.
Jabba

Nếu phương thức trả về giá trị null, thuộc tính Count sẽ không thành công. Để giữ cho mã ngắn gọn, hãy xem xét toán tử kiểm tra tham chiếu rỗng "?". Ví dụ "if (data? .Ount == 0)....." hoặc kiểm tra rỗng cổ điển "if (data! = null && someOtherCondition) ....."
daviesdoesit

Dán đoạn mã sau vào dotnetfiddle và bạn sẽ thấy System.NullReferenceException: Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng. 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

Bản thân gridview có một phương thức kiểm tra xem nguồn dữ liệu bạn đang ràng buộc có trống không, nó cho phép bạn hiển thị thứ gì đó khác.


0

Nếu bạn đang sử dụng chế độ xem lưới thì hãy sử dụng mẫu dữ liệu trống: 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>

Đây là ASP.NET rất cụ thể.
Grant Thomas,

Tôi không phải là người thích winforms nhưng cũng không phải là một chuyên gia về gridview asp.net. Đó là một chế độ xem dữ liệu trong các biểu mẫu?
David MacCrimmon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.