2017-02-07 38 views
0

我想解決一個問題。我有一個字符串填充日期範圍,格式爲「dd.MM.yyyy - dd.MM.yyyy」。C#字符串包含日期範圍,它應該分成兩個日期

var datest = shippeddaterange.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries); 
var startDate = DateTime.Parse(datest[0]); 
var endDate = DateTime.Parse(datest[1]); 

現在我想分解成2個變量,所以我可以使用我的Lambda查詢,它工作正常。我的兩個新變量應命名爲startDateendDate

data.Container = db.Container 
    .Where(a => a.ShippedDate >= startDate && a.ShippedDate <= endDate) 
    .ToList(); 

如果我編譯應用程序,它給我的錯誤,該數組值超出索引範圍

+1

然後'datest'數組只包含一個項目,因爲該字符串不包含連字符或僅包含字符串的開頭/結尾。 –

+1

或根本沒有。檢查字符串是否落在你的動作中。 –

+0

嗯,我不明白蒂姆。 這裏的工作完美Balazs: var start = new DateTime(2010,1,1); var endDate = new DateTime(2019,1,1); – NinjaCoder

回答

2

你需要做一些防禦性的編碼。不要以爲你會處於一種粗魯的覺醒狀態,而是假設金髮姑娘的情況。如果輸入不好,那麼有可能你不會得到2個項目。

public PartialViewResult SearchData(shippeddaterange) { 
    data = new ContentViewModel(); 
    using (var db = new PLSDb()) { 
     var datest = shippeddaterange.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries); 
     if(datest.Length == 2) { 
      var format = "dd.MM.yyyy"; 
      var provider = CultureInfo.InvariantCulture; 
      var startDate = DateTime.ParseExact(datest[0].Trim(), format, provider); 
      var endDate = DateTime.ParseExact(datest[1].Trim(), format, provider); 

      data.Container = db.Container 
       .Where(a => a.ShippedDate >= startDate && a.ShippedDate <= endDate) 
       .ToList();     
     }    
    } 
    return PartialView(data);   
} 
+0

如果我用鼠標懸停在SearchData上(它有一個紅色的下劃線),錯誤告訴我「並非所有的代碼路徑都返回一個值」。 – NinjaCoder

+0

更新問題中的代碼。當它在註釋中時很難理解它 – Nkosi

+0

您需要其他條件(當datest.Length不是2時) – Nkosi

1

這裏的工作相當不錯。我將寫入方法public ActionResult Index()中,在過濾器開始運行之前數據應該被過濾掉。謝謝您的幫助!

public PartialViewResult SearchData(string shippeddaterange) 
    {    
     using (var db = new PCSDb()) 
     { 

      var datest = shippeddaterange.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries); 
      if (datest.Length == 2) 
      { 
       var format = "dd.MM.yyyy"; 
       var provider = CultureInfo.InvariantCulture; 
       var startDate = DateTime.ParseExact(datest[0].Trim(), format, provider); 
       var endDate = DateTime.ParseExact(datest[1].Trim(), format, provider); 

       var data = new ContentViewModel(); 

       data.Container = db.Container.Where(a => a.ShippedDate >= startDate && a.ShippedDate <= endDate).ToList(); 
       return PartialView(data); 
      } 
      else 
      { 
       return PartialView("NameOfANewView"); 
      }     
     } 
    }