2017-04-19 14 views
0
private void CheckForNewItems() 
    { 
     var items = GetChangedItems(); 
     if (items != null) 
     { 
      foreach (var item in items) 
      { 
       var itemDB= GetItem(item.id); 
       if (itemDB!=null) 
       { 
        itemDB.somevalue= item.somevalue; 
        SaveToDatabase(itemDB); 

       } 
      } 
     } 
    } 

I上記のコードによく似たコードを書く。このシナリオでヌルをチェックするスマートな方法はありますか? "if(item!= null)"は効果がありますか? nullをチェックする必要がありますか?c#コレクションの反復処理を使用する場合はnullをチェックしないようにする

よろしく

+0

エルビス演算子: また、ヌル伝播を使用することができ

private void CheckForNewItems() { var items = GetChangedItems(); if (items != null) { foreach (var item in items) { var itemDB= GetItem(item.id); itemDB?.somevalue= item.somevalue; SaveToDatabase(itemDB); } } } 

は見をお持ちですか? https://blogs.msdn.microsoft.com/jerrynixon/2014/02/26/at-last-c-is-getting-sometimes-called-the-safe-navigation-operator/ – Webbanditten

+3

あなたの 'GetChangedItems()'メソッドが空の配列を返すので、foreachループの前に 'items'がnullであるかどうかを確認する必要はありません。 –

答えて

5

あなたは、いくつかのLINQでそれを行うことができます:私はあなたがすでに持っていたソリューションは、すべての人のために、より読みやすいと思います....

var items = GetChangedItems(); 

if (items == null) 
    return; 

var existingItems = items 
    // create a new call that holds both objects 
    .Select(i => new { ItemDB = GetItem(i.id), Item = i }) 
    // where the itemdb can be found. 
    .Where(i => i.ItemDB != null); 

foreach (var item in existingItems) 
{ 
    item.ItemDB.somevalue= item.Item.somevalue; 
    SaveToDatabase(item.ItemDB); 
} 

しかし。

2

コレクションがnullで、空を返すかどうかを確認する拡張メソッドNullOrEmptyを作成します。

public static IEnumerable<T> NullOrEmpty<T>(this IEnumerable<T> source) 
{ 
    return source ?? Enumerable.Empty<T>(); 
} 

そして、それを使用する:

foreach (var item in items.NullOrEmpty()) 
{ 
    ... 
} 
0

これは合理的な解決策である、と多くはありません変更する。

private void CheckForNewItems() 
{ 
    var items = GetChangedItems(); 
    if (items == null) 
    { 
     return; 
    } 
    foreach (var item in items) 
    { 
     var itemDB= GetItem(item.id); 
     if (itemDB!=null) 
     { 
      itemDB.somevalue= item.somevalue; 
      SaveToDatabase(itemDB); 
     } 
    } 
} 
0

あなたがNullの伝播を使用することができます周りのネストを防ぐためにあれば、私は最初に変更します。 しかし、SaveToDatabaseメソッドはNull自体をチェックする必要があります。 https://roslyn.codeplex.com/discussions/540883

関連する問題