C# list count всегда возвращает 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. Если я пройду a одна дата возвращает 1. Если я передаю две даты, он возвращает 2 и т. д. Поэтому он работает, за исключением случаев, когда ничего не передается, когда я ожидаю, что он вернет 0, но на самом деле возвращает 1.
может ли кто-нибудь указать мне в правильном направлении?
спасибо
9 ответов
даже для пустой строки,Split
вернутся эта строка в массиве, поэтому список будет создаваться... одна пустая строка, производящая .Count
на 1. [редактировать можно назвать excludeDates.Split(',', StringSplitOption.RemoveEmptyEntries)
так что это не так.]
чтобы ваша функция вела себя так, как вы ожидаете, вы, вероятно, должны попытаться проанализировать каждую строку "date", возвращенную из 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;
вы можете использовать опцию Удалить пустые записи.
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);
Это нормальное поведение. Когда нет ничего, чтобы разделить его вернет список строк в качестве первого элемента, который считается одним.
вставка пустой строки в список создаст список из одного элемента. Этот элемент будет вашей пустой строкой.
результат вызова string.Split
в строке, которая не содержит разделителя (в данном случае запятую), находится массив, содержащий один элемент, а именно исходную строку. Это также происходит, если строка пуста.
решение является задание Split
чтобы исключить пустые записи:
List<string> excluseDatesList = new List<string>(excludeDates.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries));
как сказал dlev.. но чтобы добавить пример для иллюстрации, Если вы передаете строку
","
- Это просто запятая, а затем ",".Split(',').Count()
будет возвращать 2.
для ",,,,"
это всего лишь четыре запятые, вы получите обратно 5 для подсчета...
Если вы посмотрите на метод Split, имеет следующую логику:
int num = this.MakeSeparatorList(separator, ref sepList);
if (num == 0 || count == 1)
{
return new string[]
{
this
};
}
поэтому, даже если строка является пустой строкой, она вернет один элемент в массиве.