2011-07-20 49 views
6

我試圖在C#中調試一個方法,但是我的基本語法技巧似乎缺少!該方法接受日期列表作爲逗號分隔的文本字符串。該字符串被轉換爲列表,然後進行處理。但是,即使將一個空字符串傳遞給方法,它在列表計數時仍然輸出1。即使列表爲空時,C#列表數總是返回1

的代碼如下:

public static int DaysLeft(DateTime endDate, DateTime startDate, Boolean excludeWeekends, String excludeDates) 
    { 
     int counter = 0; 

     List<string> excludeDatesList = new List<string>(excludeDates.Split(',')); 

     counter = excludeDatesList.Count; 

     return counter; 
    } 

如果我在作爲excludeDates參數傳遞一個空字符串,則返回1,如果我通過它返回1.單個日期如果我通過兩個日期,它返回2等,所以它是一種工作,除非有什麼傳入,當我希望它返回0,但它實際上返回1

任何人都可以點我在正確的方向?

感謝

回答

10

即使是一個空字符串,Split將返回該字符串數組中,所以該列表將與...一個空字符串創建,生產.Count 1的[編輯 :您可以撥打excludeDates.Split(',', StringSplitOption.RemoveEmptyEntries),以便它不會。]

要使您的函數按照您的期望行事,您應該嘗試解析從Split()返回的每個「日期」字符串,並且只會爲有效日期增加計數器。

事情是這樣的:

int counter = 0; 
    var possibleDates = excludeDates.Split(','); 

    foreach (var dateStr in possibleDates) 
    { 
     // Right now it just counts "good" dates, though could also do something 
     // with each date as well 
     DateTime dt; 
     if (DateTime.TryParse(dateStr, out dt)) 
      counter++; 
    } 

    return counter; 

如果你正在尋找的簡單方式,你應該檢查參數,看它是否是空字符串,在這種情況下,返回0:

if (string.IsNullOrEmpty(excludeDates)) 
    return 0; 
+0

啊,好的,謝謝。我需要處理一些邏輯,只有當有一個日期在那裏,所以大概我需要使用除.Count之外的方法來檢查這個。我應該使用什麼? – Dan

+0

@丹看到我的答案更新。最簡單的方法是在調用split之前檢查空字符串。 – dlev

+0

'String.Empty'檢查會好很多 – naveen

1

這是正常行爲。當沒有任何東西需要拆分的時候,它會返回一個包含字符串本身的列表作爲第一個被視爲一個的元素。

1

的由String.Split()返回的數組總是中有一個元件,即使它是空字符串。

1

向列表中插入一個空字符串將創建一個元素的列表。該元素將是您的空字符串。

3

您可以使用刪除空條目選項。

var blah = ""; 

var split = blah.Split(new[]{';'}, StringSplitOptions.RemoveEmptyEntries); 
var split2 = blah.Split(new[]{';'}); 

// Returns zero 
Console.WriteLine(split.Length); 

// Returns one 
Console.WriteLine(split2.Length); 
8

將字符分割返回空元素。

嘗試使用excludeDates.Split(',', StringSplitOptions.RemoveEmptyEntries)代替。

1

對不包含分隔符(在本例中爲逗號)的字符串調用string.Split的結果是包含單個元素(即原始字符串)的數組。如果字符串爲空,也會發生這種情況。

解決的辦法是指定Split省略空條目:

List<string> excluseDatesList = new List<string>(excludeDates.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)); 
+0

無論傳入字符串的日期數是多少,這似乎都返回0。 – Dan

0

正如dlev所述..但增加一個例子來說明,如果你通過字符串 "," - 這只是一個逗號,那麼",".Split(',').Count()將返回2. 爲",,,,"這只是四個逗號,你會得到5回數...

0

如果你看看拆分方法,它具有以下邏輯:

int num = this.MakeSeparatorList(separator, ref sepList); 
if (num == 0 || count == 1) 
{ 
    return new string[] 
    { 
     this 
    }; 
} 

因此,即使該字符串是空字符串,將在數組中返回單個項目。

相關問題