2017-04-19 50 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); 

       } 
      } 
     } 
    } 

我編寫了類似於上面代碼的很多代碼。在這種情況下是否有更智能的方法來檢查空值?是「if(item!= null)」有效嗎? 我還需要檢查空值嗎?c#避免在迭代集合時檢查空值

問候

+0

貓王操作? 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

創建一個擴展方法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

您可以使用空傳播。 但是,你的SaveToDatabase方法將不得不檢查Null本身。 它也可以使用空傳播

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://roslyn.codeplex.com/discussions/540883