Перевірте, чи список порожній у 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.