繁体   English   中英

C# 即使列表为空,列表计数也始终返回 1

[英]C# list count always returns 1 even when list is empty

我正在尝试调试 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。

谁能指出我正确的方向?

谢谢

即使对于空字符串, Split也会在数组中返回该字符串,因此将使用...创建一个空字符串,生成.Count 1。 [编辑:您可以调用excludeDates.Split(',', StringSplitOption.RemoveEmptyEntries)以便它不会。]

为了使您的 function 行为符合您的预期,您可能应该尝试解析从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);

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

String.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
    };
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM