Is it possible for String.split() to return tuple?

If you can use C# 7 – you can use tuple deconstruction. If type has static or extension method named Deconstruct with appropriate signature – this type can be deconstructed. So you can have extension method like this:

public static class Extensions {
    public static void Deconstruct<T>(this IList<T> list, out T first, out IList<T> rest) {

        first = list.Count > 0 ? list[0] : default(T); // or throw
        rest = list.Skip(1).ToList();
    }

    public static void Deconstruct<T>(this IList<T> list, out T first, out T second, out IList<T> rest) {
        first = list.Count > 0 ? list[0] : default(T); // or throw
        second = list.Count > 1 ? list[1] : default(T); // or throw
        rest = list.Skip(2).ToList();
    }
}

And then you can deconstruct string array (which implements IList<string>) with this syntax (you might need to add appropriate using so that extension method above is reachable):

var line = "a=b";
var (first, second, _) = line.Split('=');
Console.WriteLine(first); // "a"
Console.WriteLine(second); // "b"

or

var line = "a=b";
var (first, (second, _)) = line.Split('=');
Console.WriteLine(first); // "a"
Console.WriteLine(second); // "b"

Which is quite close to what you need.

With just first extension method above (which deconstructs to first element and the rest) you can deconstruct to arbitrary length:

var (first, (second, _)) = line.Split('=');
var (first, (second, (third,  _))) = line.Split('=');
var (first, rest) = line.Split('=');
// etc

Second extension method is needed only if you want a little bit more convenient syntax for deconstruction of first 2 values (var (first, second, rest) instead of var (first, (second, rest)))

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)