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"); 
    } 

각 배열은 이미지의 ID 만 보유합니다. 이것은 3 개의 배열 모두에 배열이있는 한 작동합니다. 하지만 하나가 null이면 오류가 발생합니다.

내가 필요한 것은 productImages, lifestyleImages, logoImages의 세 배열 모두를 조합 한 단일 배열입니다.

제가 누락 된 항목이 확실하지 않습니다.

+0

제쳐두고, 당신은 * 메소드 내 어디에서나'imageList'를 사용하지 않습니다 ... 실제 코드에서 그렇게합니까? –

+0

그래, 진짜 코드로 해. 그것들은 캠페인 표 캠페인 ID와 캠페인에 첨부 된 이미지를 연결하는 별도의 표에 추가됩니다. @JonSkeet –

답변

7

글쎄, null 참조를 전달하면 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(); 

...하거나 직접 널 유착 연산자를 사용하여 AS

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

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

null-coalescing 옵션을 사용하여 매력처럼 작동했습니다. 고맙습니다! –