Search code examples
c#listcoding-style

What is the best way to return two lists in C#?


I am almost embarrassed to ask this question, but as a long time C programmer I feel that perhaps I am not aware of the best way to do this in C#.

I have a member function that I need to return two lists of a custom type (List<MyType>) and I know beforehand that I will always have a return value of only two of these lists.

The obvious options are :

public List<List<MyType>> ReturnTwoLists();

or

public void ReturnTwoLists(ref List<MyType> listOne, ref List<myType> listTwo);

Both seem to be non-optimal.

Any suggestions on how to improve this?

The first way doesn't make it clear in the syntax that only 2 lists are being returned, and the second uses references rather then a return value, which seem so non-c#.


Solution

  • First of all, that should probably be out, not ref.

    Second, you can declare and return a type containing the two lists.

    Third, you can declare a generic Tuple and return an instance of that:

    class Tuple<T,U> {
       public Tuple(T first, U second) { 
           First = first;
           Second = second;
       }
       public T First { get; private set; }
       public U Second { get; private set; }
    }
    
    static class Tuple {
       // The following method is declared to take advantage of
       // compiler type inference features and let us not specify
       // the type parameters manually.
       public static Tuple<T,U> Create<T,U>(T first, U second) {
            return new Tuple<T,U>(first, second);
       }
    }
    
    return Tuple.Create(firstList, secondList);
    

    You can extend this idea for different number of items.