Проверить, пуст ли список в C # [закрыто]

125

У меня есть список объектов, заполненных из базы данных. Мне нужно отобразить сообщение об ошибке, если список пуст, и в противном случае отобразить представление сетки.

Как проверить List<T>, пуст ли в C #?

lakshganga
источник
9
Так что плохого в использовании if (list.Count == 0) { /* ... */ }?
Барт ван Ниероп,
11
Илиif (!list.Any())
Тарвен
10
Не могу понять, почему этот вопрос был отклонен. Для меня это очень специфично (СПИСОК ОБЪЕКТОВ). Здесь нет ничего «непонятного». Этот вопрос набрал более 30 тысяч просмотров. +1
MarceloBarbosa 09
2
Вопрос имеет смысл. «Мне нужно вывести сообщение об ошибке, если список пуст». Помните, что в человеческом общении важен не каждый персонаж.
Тодд Пейнтон
9
Это также результат №1 Google, C# list isemptyдля которого он полностью соответствует действительности. Я думаю, что не относящиеся к делу части вопроса следует отредактировать, и я голосую за повторное открытие.
Феликс Домбек

Ответы:

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.
Тим Шмелтер
2
Не лучше ли list == nullсначала проверить, действительно ли ?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
2
@ ᴍᴀᴛᴛʙᴀᴋᴇʀ, var someList = новый список <строка> (); будет создан экземпляр (и, следовательно, не будет нулевым), но не будет содержать элементов для обработки
daviesdoesit
74

Если вы используете реализацию списка, IEnumerable<T>а Linq - вариант, вы можете использовать Any:

if (!list.Any()) {

}

В противном случае у вас обычно есть свойство Lengthили Countдля массивов и типов коллекций соответственно.

Грант Томас
источник
10
Вкратце: list.Any имеет гораздо лучшую производительность, чем count.
Адриан Лопес,
2
@AdrianLopez: можешь подробнее рассказать об этом? Если у вас есть свойство .Countили, что можно сделать быстрее, чем проверка свойства коллекции, которая отслеживает текущую длину или количество? Если у вас есть только Enumerator, то, конечно, быстрее, чем . См. Также: stackoverflow.com/questions/305092/… или stackoverflow.com/questions/5741617/….LengthList.Any().Any().Count() > 0
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 
    }

Вы можете сделать свой datagrid видимым false и сделать его видимым в разделе else.

Кузгун
источник
@NetMage Это не то, как это работает для списка. Это O(1)операция, и для подсчета элементов не выполняется итераций. Смотрите List<T>.Count.
Spencer Wieczorek
@SpencerWieczorek Вы правы, этот комментарий был старым и ошибочным :) Хотя в целом, я все же предпочел бы Any()лучше выражать намерения, а также быть более эффективным, когда вы не знаете, что у вас есть реальный List<T>.
NetMage
18

Что насчет использования Countсобственности.

 if(listOfObjects.Count != 0)
 {
     ShowGrid();
     HideError();
 }
 else
 {
     HideGrid();
     ShowError();
 }
Йерун ван Ланген
источник
3
Подсчет - это свойство, а не метод
мусульманин Бен Дхау
5
@MoslemBenDhaou Зависит от того, является ли это метод расширения Linq, открытый / вызываемый, или собственный для объекта.
Грант Томас
@GrantThomas Я воспринял это как объект List <T>, но да, вы правы.
Мусульманин Бен Дхау
что, если listOfObjects имеет значение null?
Сабри Мевиш
2
@ SabriMeviş коллекция / ienumerable / list, возвращаемая методом, никогда не должна быть null. Вместо этого это должна быть пустая коллекция.
Йерун ван Ланген
8

Вы должны использовать простую IFинструкцию

List<String> data = GetData();

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

PopulateGrid();
ShowGrid();
Мусульманин Бен Дхау
источник
Самый простой и лучший способ ИМО.
Джабба
Если метод возвращает значение NULL, свойство Count завершится ошибкой. Чтобы код оставался кратким, рассмотрите оператор проверки нулевой ссылки «?». Пример «if (data? .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
6
var dataSource = lst!=null && lst.Any() ? lst : null;
// bind dataSource to gird source
TalentTuner
источник
3

В самом gridview есть метод, который проверяет, является ли источник данных, к которому вы его привязываете, пустым, он позволяет отображать что-то еще.

Baahubali
источник
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, но не специфичен для gridview asp.net. Это datagridview в формах?
Дэвид МакКриммон