2016-06-22 5 views
1

私は非常に奇妙な問題を抱えています。問題は面白くてシンプルに見えますが、それは私を怒らせるものです。2つのヌル入力可能な整数を加算していない

私は、このクラスのオブジェクトの配列(additionalCell)とcurrentPixelTotalCellと呼ばれる同じクラスの別のオブジェクトを有する

public int? count { get; set; } 

として宣言されたクラスにnull許容整数を持っています。配列内のすべてのオブジェクトのcount変数の値を追加し、currentPixelTotalCellのcount変数に格納します。

私のコードは以下の通りです。しかし、デバッグするとき、私は左の部分は、すべてのオブジェクトのカウント変数がnullではない値を持っていますが、ループが終了した後にのみnullとして値を持って参照してください。

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

なぜこのようなことが起こっているのですか。それらを追加する別の方法はありますか?私は無知です。

編集:

これを忘れてしまった。私がブレークポイントを持っていて、最初の反復それ自体をチェックインすると、それは加算されません。 例additionalCell [0] .countが10の場合、currentPixelTotalCell.countの値は、最初の繰り返しで内部行が実行された後でも、nullのみになりました。

+0

このすべてが言われて、あなたの最終的な解決策のようなものでなければなりません。 '.count'の代わりに' .count.Value'が必要です。 –

+0

@ LukaJacobowitz:値がない場合は例外をスローします。これがOPが望んでいるものかどうかはわかりません。 –

答えて

3

currentPixelTotalCell.count変数を最初に0に初期化する必要がありますか?

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

また、AdditionalCellオブジェクトのnull値をチェックする必要がありますか?

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

私は両方を行う必要があるように見えます。答えをありがとう。 – vinmm

2

あなたは結果としてnullを持っている場合は、

  • どちらかcurrentPixelTotalCell.count additionalCellのnull
  • いくつかの[i]を.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
にあなたの内側のループを変更

:右利きの値のいずれかがnullの場合にnullにあなたの合計を設定しないように

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

あなたNullable<T>のデフォルト値を与える.GetValueOrDefault()と呼ばれる方法があります。値がnullある場合は、0を割り当てるために、それを利用することができます:

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

あなたはそれをaccesing前に0にcurrentPixelTotalCell.countを初期化する必要があります。

は " は+ = B" " = A + B" のためだけ糖衣構文であることを覚えておいてください。

aはnullなので、実際には "a = null + b"となり、nullにはnullが等しくなります。

また、同じ制約のため、右側の値もnullでないことを確認する必要があります。あなたのケースでこれを行う簡単な方法は、単にGetValueOrDefaultメソッドを使用することです。あなたがNULL可能の値を抽出する必要が

currentPixelTotalCell.count = 0; 
for(int i = 0; i < 5; i++) 
{  
    currentPixelTotalCell.count += additionalCell[i].count.GetValueOrDefault(); 
} 
関連する問題