C#中的List.Count总是返回1,即使列表为空

6

我在尝试调试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。
有谁能指导我正确的方向吗?
谢谢
9个回答

10
即使对于空字符串而言,Split方法也会在数组中返回该字符串,因此列表将被创建为一个包含一个空字符串的数组,产生Count属性值为1。为了使函数按预期运行,您应该尝试解析从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;

啊,好的,谢谢。如果里面有日期,我需要处理一些逻辑,所以我需要使用除.Count之外的方法来检查这个。那我应该用什么? - Dan
@Dan 请查看我的回答更新。最简单的方法是在调用 split 函数之前检查空字符串。 - dlev
一个 String.Empty 的检查会更好。 - naveen
在什么情况下?我的最终观点是一个简单的参数检查。这是您所想的吗? - dlev
@naveen,excludeDatesList.Empty 在智能感知中似乎不是一个选项。 - Dan
我之前提到的是,在开始解析之前进行检查。 - naveen

8

按字符进行分割会返回一个空元素。

建议改用excludeDates.Split(',', StringSplitOptions.RemoveEmptyEntries) 进行分割。


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

1
调用字符串的string.Split方法,并且该字符串不包含分隔符(在本例中为逗号)时,返回的结果是一个包含一个元素的数组,即原始字符串。如果字符串为空,也会出现同样的情况。
解决方案是指定Split方法忽略空条目。
List<string> excluseDatesList = new List<string>(excludeDates.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries));

无论传入字符串中有多少个日期,这似乎总是返回0。 - Dan

1

这是正常的行为。当没有东西可分割时,它会返回一个列表,其中字符串本身作为第一个元素计数为一。


1
String.Split() 函数返回的数组始终包含一个元素,即使该元素为空字符串。

1
将一个空字符串插入列表中将创建一个只有一个元素的列表。该元素将是您的空字符串。

0
如果你看一下Split方法,它有以下逻辑:
int num = this.MakeSeparatorList(separator, ref sepList);
if (num == 0 || count == 1)
{
    return new string[]
    {
        this
    };
}

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

0
正如dlev所说...但为了举例说明,如果您传入字符串"," - 这只是一个逗号,那么",".Split(',').Count()将返回2。对于",,,,"这个四个逗号的字符串,您将得到5个计数...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接