简体   繁体   中英

C# list count always returns 1 even when list is empty

I'm trying to debug a method in C# but my basic syntax skills here seem to be lacking. The method accepts a list of dates as a comma-separated text string, This string is converted to a list. then processed, However, it seems that even when an empty string is passed to the method. it still outputs 1 when the list is counted.

The code is as follows:

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

If I pass an empty string in as the excludeDates parameter, it returns 1. If I pass a single date it returns 1. If I pass two dates, it returns 2 etc. So it's kind of working except where there's nothing passed in, when I'd expect it to return 0 but it actually returns 1.

Can anyone point me in the right direction?

Thanks

Even for an empty string, Split will return that string in the array, so the list will be created with... one empty string, producing a .Count of 1. [ Edit : You can call excludeDates.Split(',', StringSplitOption.RemoveEmptyEntries) so that it doesn't.]

To make your function behave as you expect, you should probably try to parse each "date" string returned from Split() , and only increment the counter for valid dates.

Something like this:

    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;

If you're looking for the simplest way, you should just check the parameter to see if it's the empty string, and return 0 in that case:

if (string.IsNullOrEmpty(excludeDates))
    return 0;

Splitting on the character is returning an empty element.

Try using excludeDates.Split(',', StringSplitOptions.RemoveEmptyEntries) instead.

You can use the remove empty entries option.

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

That is normal behavior. When there is nothing to split it will return a list with the string itself as the first element which counts as one.

The array returned by String.Split() always has one element in it, even if it is the empty string.

Inserting an empty string into the list will create a list of one element. That element would be your empty string.

The result of calling string.Split on a string that doesn't contain the delimiter (in this case, a comma), is an array containing a single element, namely the original string. This also happens if the string is empty.

The solution is to specify Split to omit empty entries:

List<string> excluseDatesList = new List<string>(excludeDates.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries));

As dlev said.. but to add an example to illustrate, if you pass in the string "," - which is just a comma, then ",".Split(',').Count() will return 2. for ",,,," which is just four commas, you will get back 5 for the count...

if you look at the Split method, it has the following logic:

int num = this.MakeSeparatorList(separator, ref sepList);
if (num == 0 || count == 1)
{
    return new string[]
    {
        this
    };
}

Therefore, even if the string is an empty string it will return a single item in the array.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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