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

Это нормальное поведение. Когда нет ничего, чтобы разделить его вернет список строк в качестве первого элемента, который считается одним.


массив, возвращаемый строкой.Split () всегда имеет один элемент, даже если это пустая строка.


вставка пустой строки в список создаст список из одного элемента. Этот элемент будет вашей пустой строкой.


результат вызова 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
    };
}

поэтому, даже если строка является пустой строкой, она вернет один элемент в массиве.