2014-08-27 3 views
1

У меня есть страница, которая может проходить от 1 массива до 3 массивов.Объединение пустых/нулевых массивов

Мой текущий код работает, но только если каждый массив заполнен элементами.

[HttpPost, ValidateInput(false)] 
    public ActionResult AddCampaign(string campaignName, string editor1, Int32[] 
productImages, Int32[] lifestyleImages, Int32[] logoImages) 
    { 

     // Add image list to CampaignImages table 
     // Combine image array list into a single array 
     var imageList = productImages.Concat(lifestyleImages).Concat(logoImages).ToArray(); 

     return RedirectToAction("AddCampaign", "Admin"); 
    } 

Каждый массив является то же самое, что он будет содержать только идентификатор изображения. Это будет работать, пока все 3 массива имеют что-то в них. Но если один из них является нулевым, он ошибается.

Что мне нужно, это единственный массив, который представляет собой комбинацию из всех 3 массивов, productImages, lifestyleImages, logoImages.

Не уверен, что мне не хватает.

+0

Как и в сторону, вы не * используете * 'imageList' в любом месте метода ... вы делаете это в реальном коде? –

+0

Да, я делаю это в реальном коде. Они добавляются в отдельную таблицу, связывающую идентификатор кампании с таблицей кампаний с изображениями, которые они прикрепляют для кампании. @JonSkeet –

ответ

7

Ну, вы упускаете тот факт, что Concat будет генерировать исключение, если вы передадите ему нулевую ссылку ... но это достаточно легко исправить. Либо написать метод расширения, как это:

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

И называют его:

var imageList = productImages.NullToEmpty() 
          .Concat(lifestyleImages.NullToEmpty()) 
          .Concat(logoImages.NullToEmpty()) 
          .ToArray(); 

... или просто использовать оператор нуль-коалесцирующий непосредственно:

var empty = Enumerable.Empty<int>(); 

var imageList = (productImages ?? empty).Concat(lifeStyleImages ?? empty) 
             .Concat(logoImages ?? empty) 
             .ToArray(); 
+0

Я использовал параметр null-coalescing, который работал как шарм. Спасибо! –

Смежные вопросы