2016-01-09 3 views
0

Я хочу написать метод, чтобы судить, если isNullOrEmpty экземпляра ICollection, например:что тип массива

public static bool IsCollectionNullOrEmpty<T>(ICollection<T> instance) 
{ 
    if (instance == null) 
    { 
     return true; 
    } 
    else 
    { 
     if (instance.GetType() == typeof(Array)) 
     { 
      return new List<T>(instance).Count <= 0; 
     } 
     else 
     { 
      return instance.Count <= 0; 
     } 
    } 
} 

На самом деле, я не знаю, как получить тип, например, если это, как T [], пожалуйста, помогите мне, если будет пример, будет замечательно, спасибо

+3

'вернуть экземпляр == NULL || instance.Count == 0; 'это все, что вам нужно, я верю. – Phill

ответ

0

Лучший способ сделать это вместо этого - использовать IEnumerable (Который является более общим, чем ICollection, так как ICollection реализует IEnumerable) и просто проверяя его на нуль и еще возвращаются Any() от операторов Linq в

public static bool IsCollectionNullOrEmpty<T>(IEnumerable<T> instance) 
{ 
    if (instance == null) 
    { 
     return true; 
    } 
    return !instance.Any(); 
} 

Или, как другие упомянутые если вы хотите придерживаться ICollection, то нет никакой необходимости проверьте наличие массивов и все это, вы возьмете ICollection, и ICollection имеет член счета, поэтому вы можете напрямую использовать счет, не нужно передавать массив в новый конструктор списка для доступа к свойству count.

Причина, по которой вы не можете просто сделать. Вычисление на случайном массиве связано с тем, что реализация скрыта, но поскольку в этом контексте ваш параметр не является эксцентричным массивом, а ICollection, вы можете просто вызвать .Count on it (array имеет метод .Count, это просто скрыто, но оно должно иметь его, так как он реализует ICollection)

https://msdn.microsoft.com/en-us/library/ms173157.aspx

Вот почему:

((ICollection)(new int[] { 0 })).Count; // this compiles 
(new int[] { 0 }).Count; // this doesn't, althought it's the same object 

Так что, если вы действительно хотите, чтобы написать это, как вы вы могли бы упростить его s такая:

public static bool IsCollectionNullOrEmpty<T>(ICollection<T> instance) 
{ 
    if (instance == null) 
    { 
     return true; 
    } 
    return instance.Count <= 0; // this does the exact same thing as your previous else block except it's massively simpler and doesn't create a new list 
} 

Обратите внимание, что это на самом деле не звучит как полезный метод на всех (я бы бросить его лично), так как он едва добавляет любое значение по любому оператору, так что я бы просто проверить нуль если необходимо, а затем вызвать любой, не создавая для этого собственный метод.

Вместо того, чтобы использовать этот метод, я бы просто сделать следующее каждый раз у меня есть коллекция мне нужно проверить:

if(mycollection == null || (!mycollection.Any()) 
+0

Thx! Я просто хочу написать метод вместо проверки null и Empty – Lemon

3

может использовать GetType().IsArray, но это ограничивает вас чистыми типами массивов. Более общим решением было бы проверить его свойство Count, так как вы уже знаете, что это ICollection<T>. Это будет работать и для массивов.

0

Вы можете использовать:

if(instance.GetType() == typeof (T[])) 
2

Не знаю, почему вам нужно такое странное бросание, как массив уже реализует ICollection<T>:

public static bool IsCollectionNullOrEmpty<T>(this ICollection<T> instance) 
{ 
     return instance == null ? true : instance.Count == 0; 
} 

Добавлено this разрешить применение в качестве метода расширения тоже:

var isEmpty = (new int[0]).IsCollectionNullOrEmpty(); 
+1

Для этого вам не нужен тройной оператор, просто или результат. – Phill

+0

@Phill действительно. Условный оператор немного близок к синтаксису OP. –

+0

Достаточно честный. :) – Phill

Смежные вопросы