Въпрос за валидация на Колекция в property


1

Здравейте колеги,

Имам следният въпрос...

Когато правим проверка в сетърите на пропертито на стрингове и числа всичко е ясно..

използваме нещо от сорта на : 

        public int Count
        {
            get { return this.count; }
            private set 
            {

                if (value <= 0)
                {
                    throw new ArgumentException("Number of lections can not be negative or 0");
                }

                this.count= value; 
            }
        }

.. и сътоветно нещо от сорта на if (string.IsNullOrEmpty(value)) когато става дума за избягване на празни стрингове и нулeви стойности...

Въпроса ми обаче е следният :

Ако искам да направя проверка в сетъра на Колекция така че да съм сигурен че не получавам празна колекция как да го направя - value не ми върши работа по конвенционалният начин...а достъпването на колекцията примерно от тип List чрез Count също дава Exception

пример :

        public List<Discipline> SetDisciplines
        {
            get { return this.setDisciplines; }
            private set   // how to check if setDisciplines.Count is not 0 .. 
            {
                this.setDisciplines = value; 
            }
        }




Отговори



0

Много хубав въпрос, браво.

Аз не мога да ти помогна, но ще се възползвам от Отговорите на тези, които ще помогнат. :)))

от ilian82 (568 точки)


2

if (value.Count ==0) { throw new ... }

this.setD.. = value;

 

от topalkata (6442 точки)


0

Златен си Тупалка! Душата ми изяде това а колко било елементарно ...  :)


от divided.zero (692 точки)

0
А защо празната колекция да е невалидна? Ясно е, че зависи от конкретната задача (цел), но в 90% случаите празна колекция си е напълно валидно нещо и е ок да се проверява само за null.

от westi3m (5621 точки)


4

 Според мен тази проверка не е достатъчно. Първо трябва да провериш дали не се подава null. Ако е null и се опиташ да намериш бройката на елементите в списъка, познай какво става.

 Когато си сигурен че не е  null, чак тогава можеш да извикаш count за всичко, което имплементира ICollection. Ако е IEnumerable, не става.


от ivan.mihov1 (4988 точки)


0

Прав си - веднага тествах 

.. това като цяло решава проблема за ICollection

                if (value.Count <= 0 || value == null)


от divided.zero (692 точки)

3

 if (value.Count <= 0 || value == null)

Точно в тази конструкция подреждането е изключително важно. Правилния начин е :

 if (value == null || value.Count <= 0 )Ако value == null то втората част няма да се изпълни и няма да гръмне. По твоя начин ако подадеш null първата проверка ще гръмне защото value няма пропърти Count. 


от JulianG (5316 точки)



6

Можеш да си дефинираш extension method, който проверява IEnumerable<T> collections за null || empty:

public static bool IsNullOrEmpty<T>(this IEnumerable<T> enumerable)
{
  if(enumerable == null)
    return true;

  return !enumerable.Any();
}


от lnikod4s (6538 точки)


0

Според мен проверката за Count трябва да е без равно защото като инициализираш колекция в конструктора ще гръмне а не трябва.

if (  value == null || value.Count < 0)


от TodorDimitrov (757 точки)


0

Искам да попитам, валидирате ли дали студентския номер е уникален?

Аз опитах със едно filed+property HashSet<int> stId и метода по-долу,но нещо не ми се получава. Изобщо не влиза в set на StudentId prop :

public bool GetIsUnique (int studentId)
        {
            foreach (var item in stId)
            {
                if (!stId.Add(item))
                    return false;
            }
            return true;
        }


от Alex_H (1616 точки)


1

public bool IsUnique(int studentId)

{

   if( !stId.Contains(studentId))

   {

       stId.Add(studentId);

       return true;

     }

return false

}



0

Благодяря ти Николай, сега и двата метода работят(твоя обаче е по- як, така че си го вземам). Имах проблем с конструктора. ^..^                                                                                                                                                                 \0/


от Alex_H (1616 точки)