Перевірте, чи список порожній у C # [закрито]


125

У мене є список об'єктів, заповнених з бази даних. Мені потрібно відобразити повідомлення про помилку, якщо список порожній, а відображення сітки відображається в іншому випадку.

Як я можу перевірити, чи а List<T>порожній у C #?


9
Отже, що не так з використанням if (list.Count == 0) { /* ... */ }?
Барт ван Нієроп

11
Абоif (!list.Any())
Тарвен

10
Не можу зрозуміти, чому це питання було скасовано. Для мене це дуже специфічно (СПИСОК ОБ'ЄКТІВ). Тут нічого "незрозумілого" немає. Це питання має понад 30 тис. Переглядів. +1
MarceloBarbosa

2
Питання має ідеальний сенс. Msgstr "Мені потрібно відобразити повідомлення про помилку, якщо список порожній". Пам’ятайте, що в людському спілкуванні має значення не кожен персонаж.
Тодд Пейнтон

9
Це також результат №1 Google, C# list isemptyза який він цілком важливий. Я думаю, що невідповідні частини питання слід відредагувати, і я голосую за повторне відкриття.
Фелікс Домбек

Відповіді:


142

Чому ні...

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

Значення GridViewhas також є, 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.
Тім Шмелтер

2
Не було б найкраще перевірити, чи list == nullспочатку?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

2
@ ᴍᴀᴛᴛʙᴀᴋᴇʀ, var someList = новий Список <string> (); буде створено (і тому не буде нульовим), але буде порожнім елементів для обробки
daviesdoesit

74

Якщо реалізація списку, яку ви використовуєте, є IEnumerable<T>Linq - це варіант, ви можете використовувати Any:

if (!list.Any()) {

}

Інакше у вас зазвичай є Lengthабо Countвластивість відповідно до масивів та типів колекції.


10
Як швидка примітка: list.Any має набагато кращі показники, ніж підрахунок.
Адріан Лопес

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.
Спенсер

@SpencerWieczorek Ви праві, цей коментар був старим і невірним :) Хоча в цілому, я б все-таки вважав за краще Any()висловлювати намір, а також бути більш ефективним, коли ви не знаєте, що у вас справжній List<T>.
NetMage

18

А як щодо використання Countмайна.

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

3
Порахувати - це властивість, а не метод
мусульманин Бен Дау

5
@MoslemBenDhaou Залежить від того, чи це метод розширення Linq, який піддається / виклику, або рідний для об'єкта.
Грант Томас

@GrantThomas Я сприйняв це як об'єкт List <T>, але так, ти прав.
Мусульманський Бен Дау

що робити, якщо listOfObjects є нульовим?
Сабри Мевіш

2
@ SabriMeviş колекція / безліч / список, повернутий із методу, ніколи не повинен бути null. Натомість це має бути порожня колекція.
Єроен ван Ланген

8

Вам слід скористатися простим IFтвердженням

List<String> data = GetData();

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

PopulateGrid();
ShowGrid();

Найпростіший і найкращий спосіб ІМО.
Джабба

Якщо метод поверне нуль, властивість Count не вдасться. Щоб зберегти код стислим, розгляньте оператор перевірки нульових довідок "?". Приклад "if (дані? .Count == 0). ...." або класична нульова перевірка "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.
Грант Томас

Я не хлопці з форматом winforms, але не є специфічним для сімейного перегляду asp.net. Це перегляд даних у формах?
Девід МакКрімон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.