即使列表为空,C#列表计数也总是返回1

本文关键字:列表 返回 | 更新日期: 2023-09-27 18:02:47

我试图在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时。

有人能给我指正确的方向吗?

感谢

即使列表为空,C#列表计数也总是返回1

即使对于空字符串,Split也会在数组中返回该字符串,因此列表将使用。。。一个空字符串,产生1的.Count。[编辑:您可以调用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;

对字符进行拆分将返回一个空元素。

请尝试使用excludeDates.Split(',', StringSplitOptions.RemoveEmptyEntries)

您可以使用删除空条目选项。

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

这是正常行为。当没有要拆分的内容时,它将返回一个列表,其中字符串本身作为第一个元素,该元素计数为1。

String.Splitt((返回的数组中总是有一个元素,即使它是空字符串。

在列表中插入一个空字符串将创建一个元素列表。该元素将是空字符串。

对不包含分隔符(在本例中为逗号(的字符串调用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
    };
}

因此,即使字符串是空字符串,它也会返回数组中的单个项。