C# – Parse a comma-separated string into a list of integers

Let’s say you want to parse a comma-separated string into a list of integers. For example, you have “1,2,3” and you want to parse it into [1,2,3]. This is different from parsing CSV with rows of comma-separated values. This is more straightforward. You can use string.Split(“,”) to get the individual string values and then convert each string to an int.

If you don’t need to guard against invalid data, you can do this with a Linq one-liner:

using System.Linq;

var csv = "1,2,3";

var ints = csv.Split(",").Select(i => Int32.Parse(i)).ToList();

Console.WriteLine($"We have {ints.Count} ints");
Code language: C# (cs)

This outputs:

We have 3 ints

Even though this example is specifically showing how to parse comma-separated integers, you can do the same approach for any target type (decimal, DateTime, etc…). You can either use Convert.ChangeType() to convert the string to any type or use the type’s specific converter method.

Guard against invalid data

The one-liner approach with Linq will fail if there’s invalid data (including overflow exceptions where the string value won’t fit in a 32-bit int).

Let’s say you want to parse the comma-separated integers and only add valid ones to the list. You can do that by splitting the string, looping through the individual values, and using Int32.TryParse (instead of Int.Parse()). Here’s a method that does this:

List<int> ParseInts(string csv)
{
    var ints = new List<int>();

    if (string.IsNullOrEmpty(csv))
        return ints;

    foreach (string s in csv.Split(","))
    {
        if (Int32.TryParse(s, out int i))
            ints.Add(i);
    }

    return ints;
}
Code language: C# (cs)

Here’s an example of using this method on various inputs (valid and invalid):

var first = ParseInts("1,2,3");
Console.WriteLine($"First has {first.Count} valid ints");

var second = ParseInts("");
Console.WriteLine($"Second has {second.Count} valid ints");

var third = ParseInts("1,2,c,4d");
Console.WriteLine($"Third has {third.Count} valid ints");
Code language: C# (cs)

This outputs the following:

First has 3 valid ints
Second has 0 valid ints
Third has 2 valid ints

Parsing into a HashSet

If you want a HashSet instead of a List (to only keep unique values and for efficient lookup), use the Linq ToHashSet() method, like this:

using System.Linq;

var csv = "1,2,3";

var intSet = csv.Split(",").Select(i => Int32.Parse(i)).ToHashSet();

Console.WriteLine($"Set has 1? {intSet.Contains(1)}");
Console.WriteLine($"Set has 200? {intSet.Contains(200)}");
Code language: C# (cs)

This outputs the following:

Set has 1? True
Set has 200? FalseCode language: plaintext (plaintext)