Search code examples
c#linqouttryparse

Convert a string in a List<int> using LINQ (cleaner way)


I have this string:

string input = "1,2,3,4,s,6";

Pay attention to the s character.

I just want to convert this string in a List<int> using LINQ. I initially tried in this way:

var myList = new List<int>();
input.Split(',').ToList().ForEach(n =>
    myList.Add(int.TryParse(n, out int num) ? num : -1)
);
lista.RemoveAll(e => e == -1);

But I prefer not have any -1 instead of a no-number characters.

So now I try with this:

var myList = new List<int>();
input.Split(',').ToList()
    .FindAll(n => int.TryParse(n, out int _))
    .ForEach(num => myList.Add(int.Parse(num)));

I prefer this, but is really a shame that the parsing happening two times (TryParse at first and then Parse). But, from what I understand, the out variable in TryParse is useless (or not?).

Have you others suggests (using LINQ)?


Solution

  • public class ParsesStringsToIntsWithLinq
    {
        public IEnumerable<int> Parse(string input)
        {
            var i = 0;
            return (from segment in input.Split(',')
                where int.TryParse(segment, out i) 
                select i);
        }
    }
    
    [TestClass]
    public class Tests
    {
        [TestMethod]
        public void IgnoresNonIntegers()
        {
            var input = "1,2,3,4,s,6";
            var output = new ParsesStringsToIntsWithLinq().Parse(input);
            Assert.IsTrue(output.SequenceEqual(new []{1,2,3,4,6}));
        }
    }
    

    It doesn't return a List<int> but I have to draw the line somewhere. You can make a list out of it.