ตรวจสอบว่ารายการว่างเปล่าใน C # [ปิด]


125

ฉันมีรายการวัตถุที่เติมจากฐานข้อมูล ฉันต้องการแสดงข้อความแสดงข้อผิดพลาดหากรายการว่างเปล่าและแสดงมุมมองตารางเป็นอย่างอื่น

ฉันจะตรวจสอบว่า a List<T>ว่างใน C # ได้อย่างไร


9
แล้วใช้อะไรผิดif (list.Count == 0) { /* ... */ }?
Bart van Nierop

11
หรือif (!list.Any())
Tharwen

10
ไม่เข้าใจว่าทำไมคำถามนี้จึงถูกลดคะแนน สำหรับฉันมันเฉพาะเจาะจงมาก (LIST OF OBJECTS) ที่นี่ไม่มีอะไร "ไม่ชัดเจน" คำถามนี้มีผู้เข้าชมมากกว่า 30k ครั้ง +1
MarceloBarbosa

2
คำถามนี้สมเหตุสมผล "ฉันต้องการแสดงข้อความแสดงข้อผิดพลาดหากรายการว่างเปล่า" จำไว้ว่าในการสื่อสารของมนุษย์ไม่ใช่ว่าทุกตัวละครจะมีความสำคัญ
Todd Painton

9
นี่เป็นผลการค้นหาอันดับ 1 ของ Google C# list isemptyที่ตรงประเด็นอย่างสมบูรณ์ ฉันคิดว่าส่วนที่ไม่เกี่ยวข้องของคำถามควรได้รับการแก้ไขและฉันโหวตให้เปิดอีกครั้ง
Felix Dombek

คำตอบ:


143

ทำไมจะไม่ล่ะ...

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

GridViewมียังมีEmptyDataTemplateซึ่งจะปรากฏหากแหล่งข้อมูลที่ยังว่างอยู่ นี่คือแนวทางใน ASP.NET:

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

<emptydatatemplate>

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

    No Data Found!  

</emptydatatemplate> 

2
หมายเหตุ: แนวทางที่สองถือว่า ASP.NET
Tim Schmelter

2
จะไม่เป็นการดีที่สุดที่จะตรวจสอบlist == nullก่อนหรือไม่?
ᴍᴀᴛᴛʙᴀᴋᴇʀ

2
@ ᴍᴀᴛᴛʙᴀᴋᴇʀ, var someList = รายการใหม่ <string> (); จะถูกสร้างอินสแตนซ์ (ดังนั้นจึงไม่เป็นโมฆะ) แต่จะว่างเปล่าขององค์ประกอบที่จะประมวลผล
daviesdoesit

74

หากการใช้งานรายการที่คุณใช้อยู่IEnumerable<T>และ Linq เป็นตัวเลือกคุณสามารถใช้Any:

if (!list.Any()) {

}

มิฉะนั้นคุณจะมีคุณสมบัติLengthหรือCountคุณสมบัติในอาร์เรย์และประเภทคอลเลกชันตามลำดับ


10
เป็นบันทึกย่อ: รายการใด ๆ ที่มีประสิทธิภาพดีกว่าการนับ
Adrian Lopez

2
@AdrianLopez: คุณสามารถอธิบายได้ไหม? หากคุณมี.Countหรือ.Lengthคุณสมบัติเช่นเดียวกับListสิ่งที่.Any()อาจทำได้เร็วกว่าการตรวจสอบคุณสมบัติของคอลเลกชันที่ติดตามความยาวหรือจำนวนปัจจุบัน? หากคุณมีเพียงการแจงนับแล้วเป็นหลักสูตรที่เร็วกว่า.Any() .Count() > 0ดูสิ่งนี้ด้วย: stackoverflow.com/questions/305092/…หรือstackoverflow.com/questions/5741617/…
noox

2
@noox เมื่อดูที่แหล่งที่มา (.Net Core) ดูเหมือนว่าการAnyตรวจสอบเพื่อตรวจสอบความถูกต้องว่าการดึงจำนวนนั้นมีราคาถูกก่อนที่จะทดสอบในกรณีที่คุณมีIListProvider<>ที่ไม่ได้ติดตามการนับจะมีการแจกแจงครั้งเดียวแทน
NetMage

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

คุณสามารถทำให้ดาต้ากริดของคุณมองเห็นเป็นเท็จและทำให้มองเห็นได้ในส่วนอื่น


@NetMage นั่นไม่ใช่วิธีการทำงานสำหรับรายการ เป็นการO(1)ดำเนินการและไม่มีการทำซ้ำสำหรับการนับองค์ประกอบ ดูList<T>.Count.
Spencer Wieczorek

@SpencerWieczorek คุณถูกต้องที่ความคิดเห็นของอายุเช่นเดียวกับการที่ไม่ถูกต้อง :) แม้ว่าโดยทั่วไปฉันยังคงต้องการAny()เป็นการแสดงเจตนาที่ดีขึ้นเช่นเดียวกับการ performant List<T>มากขึ้นเมื่อคุณไม่ทราบว่าคุณมีจริง
NetMage

18

สิ่งที่เกี่ยวกับการใช้Countทรัพย์สิน

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

3
การนับเป็นคุณสมบัติไม่ใช่วิธีการ
Moslem Ben Dhaou

5
@MoslemBenDhaou ขึ้นอยู่กับว่าเป็นวิธีการขยาย Linq ที่เปิดเผย / ถูกเรียกหรือเป็นของวัตถุ
Grant Thomas

@GrantThomas ฉันเอาเป็นรายการ <T> วัตถุ แต่ใช่คุณถูกต้อง
Moslem Ben Dhaou

จะเกิดอะไรขึ้นถ้า listOfObjects เป็นโมฆะ
Sabri Meviş

2
@ SabriMevişคอลเลกชัน / รายการ / a IEnumerable nullกลับมาจากวิธีการที่ไม่ควร ควรเป็นคอลเล็กชันเปล่าแทน
Jeroen van Langen

8

คุณควรใช้IFคำสั่งง่ายๆ

List<String> data = GetData();

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

PopulateGrid();
ShowGrid();

IMO วิธีที่ง่ายและดีที่สุด
Jabba

ถ้าเมธอดส่งคืนค่าว่างคุณสมบัติ Count จะล้มเหลว เพื่อให้โค้ดกระชับให้พิจารณาตัวดำเนินการตรวจสอบการอ้างอิงว่าง "?" ตัวอย่าง "if (data? .Count == 0)...." หรือการตรวจสอบ null คลาสสิก "if (data! = null && someOtherCondition) ..... "
daviesdoesit

วางรหัสต่อไปนี้ลงใน dotnetfiddle แล้วคุณจะเห็น System.NullReferenceException: การอ้างอิงวัตถุไม่ได้ตั้งค่าเป็นอินสแตนซ์ของวัตถุ 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


3

gridview เองก็มีวิธีการตรวจสอบว่าแหล่งข้อมูลที่คุณผูกไว้ว่างเปล่าหรือไม่ซึ่งจะช่วยให้คุณสามารถแสดงอย่างอื่นได้


0

หากคุณใช้ gridview ให้ใช้เทมเพลตข้อมูลเปล่า: 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>

นี่เป็น ASP.NET ที่เฉพาะเจาะจงมาก
Grant Thomas

ฉันไม่ใช่คนที่ใช้ winforms แต่ไม่ใช่คนเฉพาะของ gridview asp.net เป็น datagridview ในรูปแบบ?
David MacCrimmon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.