Подтвердить что ты не робот

Каков наилучший способ вернуть два списка в С#?

Я почти смущен, чтобы задать этот вопрос, но, как программист на длительный срок, я чувствую, что, возможно, я не знаю, как лучше всего это сделать на С#.

У меня есть функция-член, мне нужно вернуть два списка пользовательского типа (List<MyType>), и я заранее знаю, что всегда буду иметь возвращаемое значение только двух из этих списков.

Очевидными параметрами являются:

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

или

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

Оба кажутся неоптимальными.

Любые предложения по улучшению этого?

Первый способ не дает понять, что в синтаксисе возвращаются только 2 списка, а второй использует ссылки, а не возвращаемое значение, которое кажется таким не-С#.

4b9b3361

Ответ 1

Прежде всего, это должно быть out, а не ref.

Во-вторых, вы можете объявить и вернуть тип, содержащий два списка.

В-третьих, вы можете объявить общий Tuple и вернуть экземпляр этого:

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

Вы можете расширить эту идею для разных элементов.

Ответ 2

Вернуть это:

public class MyTwoLists {
    public List<MyType> ListOne {get;set;}
    public List<MyType> ListTwo {get;set;}
}

Ответ 3

Ваше первое предложение - это не два списка. Это список списков.

Второй вариант будет делать то, что вы намереваетесь, но вы можете изменить его, чтобы использовать ключевое слово out вместо ref, чтобы вызывающие пользователи вашего метода знали, что вы делаете.

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

Ответ 4

У вас есть несколько вариантов:

используйте пар, если списки бессмысленны по порядку:

 public Pair<List<MyType>,List<MyType> ReturnTwoLists()
 {
        return new Pair(new List<MyType(), new List<MyType());
 }

Вы можете использовать или отредактировать параметры, как вы упомянули. Это хороший вариант, если один список более значим, чем другой.

Вы можете использовать словарь, если клиент будет знать ключи или хочет выполнить работу, чтобы просмотреть их:

 public Dictionary<string,List<MyType> ReturnTwoLists()
 {
        Dictionary<string,List<MyTpe>> d = new Dictionary<string,List<MyType>>();
        d.Add("FirstList",new List<MyType>());
        d.Add("SecondList",new List<MyType>());
        return new Dictionary()(new List<MyType(), new List<MyType());
 }

Или, самое "правильное" решение в моих глазах, для полноты и последовательности, было бы создание простого класса контейнера данных для хранения двух списков. Это дает потребителю строго типизированные, хорошие статически скомпилированные (read: intellisense-enabled) возвращаемые значения для работы. Класс может быть вложен рядом с методом.

Ответ 5

Создайте простую структуру, которая содержит оба и вернет это как выход функции?