Вопрос по coding-style, list, c# – Каков наилучший способ вернуть два списка в C #?

16

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

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

Очевидные варианты:

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

или же

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

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

Любые предложения о том, как улучшить это?

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

Ваш Ответ

5   ответов
24

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

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

4

Ваше первое предложение не состоит из двух списков. Это список списков.

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

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

Прежде всего, это должно быть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);

Вы можете распространить эту идею на разное количество предметов.

@Mark: не думал об этом. Прежде чем я подумаю об этом, я подумаю о переходе на F #!
Просто остаток ... .NET 4.0 имеет Tuple & lt; & gt; тип.
Я вижу, что вы использовали T и U, чтобы указать элементы. Если бы у вас было больше двух кортежей, вы бы выбрали T-U-V-W ... или T-U-P-L-E? :)
3

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

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

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

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

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

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

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

Похожие вопросы