2016-06-22 9 views
1

У меня очень странная проблема. Проблема выглядит смешной и простой, но это делает меня безумным.Добавление двух нулевых целых чисел, не работающих

У меня есть обнуляемого целое число в классе, которые объявлены как

public int? count { get; set; } 

У меня есть массив объектов (additionalCell) данного класса, а другой объект того же класса под названием currentPixelTotalCell. Я хочу добавить значения переменной count всех объектов в массиве и сохранить их в переменной count currentPixelTotalCell.

Мой код такой, как показано ниже. Но при отладке я вижу, что левая часть имеет значение как null только после выхода цикла, хотя переменные count во всем объекте имеют ненулевое значение.

for(int i = 0; i < 5; i++) 
{  
    currentPixelTotalCell.count += additionalCell[i].count; 
} 

Любая идея, почему это происходит? Есть ли другой способ добавить их? Я не знаю.

Редактировать:

Забыл, упомянув об этом. Когда у меня есть точка останова и проверка первой самой итерации, она не складывается. Например. Если anotherCell [0] .count равнялся 10. Тогда значение currentPixelTotalCell.count использовалось как null только после того, как внутренняя строка была выполнена на первой итерации.

+0

вам нужно извлечь значение Nullable. Вместо '.count' он должен быть' .count.Value'. –

+0

@LukaJacobowitz: который будет генерировать исключение, если нет значения. Не уверен, что это то, чего хочет OP. –

ответ

3

Возможно, вам нужно сначала инициализировать переменную currentPixelTotalCell.count до нуля?

currentPixelTotalCell.count = 0; 
for(int i = 0; i < 5; i++) 
{  
    currentPixelTotalCell.count += additionalCell[i].count; 
} 

или вам, возможно, придется проверять наличие нулевых значений в объектах AdditionalCell?

for(int i = 0; i < 5; i++) 
{  
    currentPixelTotalCell.count += (additionalCell[i].count ?? 0) 
} 
+0

Похоже, мне нужно делать и то, и другое. Спасибо за ответ. – vinmm

2

Если у вас есть null в результате то

  • Либо currentPixelTotalCell.count является null
  • Некоторые из additionalCell [я] .Count является null

Убедитесь, что оба null находятся под контролем

// currentPixelTotalCell.count is not null 
    currentPixelTotalCell.count = 0; 

    for(int i = 0; i < 5; i++) 
    {  
     // if additionalCell[i].count is null treat it as 0 
     currentPixelTotalCell.count += additionalCell[i].count ?? 0; 
    } 

вы можете попробовать Linq в качестве альтернативы:

currentPixelTotalCell.count = additionalCell 
    .Take(5) // if you want take just first 5 items 
    .Sum(item => item ?? 0); 
2

Изменить внутреннюю петлю на:

currentPixelTotalCell.count += (additionalCell[i].count ?? 0); 

, чтобы избежать установки вашей общей обнулить в случае один из правшой значений равно нулю.

1

Я думаю, что результат null, потому что одно из значений: null.

насчет:

currentPixelTotalCell.count += additionalCell.Select(x => x.count) 
               .Where(x => x.HasValue) 
               .Sum(); 

Или

currentPixelTotalCell.count += additionalCell.Sum(x => x.count ?? 0); 

Не забудьте инициализировать currentPixelTotalCell.count где-то или заменить += простым назначением =.

0

Существует метод, называемый .GetValueOrDefault(), который даст вам значение по умолчанию Nullable<T>. Вы можете использовать его, чтобы присвоить 0 если значение null:

for(int i = 0; i < 5; i++) 
{  
    currentPixelTotalCell.CmvF =currentPixelTotalCell.CmvF.GetValueOrDefault() + additionalCell[i].CmvF.GetValueOrDefault(); 
} 
1

Вы должны инициализировать currentPixelTotalCell.count на 0 до экранного его.

Помните, что "а + = Ь" является просто синтаксический сахар для "а = а + б".

Потому что a имеет значение null, вы эффективно выполняете «a = null + b» и значение null плюс что-то равно null.

Также из-за того же ограничения вам необходимо убедиться, что значение с правой стороны также не равно нулю. Более простой способ сделать это в вашем случае - просто использовать метод GetValueOrDefault.

Все это, как говорится, ваше окончательное решение должно быть что-то вроде:

currentPixelTotalCell.count = 0; 
for(int i = 0; i < 5; i++) 
{  
    currentPixelTotalCell.count += additionalCell[i].count.GetValueOrDefault(); 
} 
Смежные вопросы