Возврат двух списков в C#
Я изучал это некоторое время, и все еще не уверен, как реализовать и каков наилучший способ вернуть два списка из отдельного метода?
Я знаю, что есть аналогичный вопрос, плавающий вокруг, но они, кажется, противоречат друг другу о том, какой лучший способ сделать это. Мне просто нужно простое и эффективное решение моей проблемы. Спасибо заранее.
6 ответов
есть много способов.
-
возврат коллекции списков. Это не хороший способ сделать это, если вы не знаете размер списков или, если это более 2-3 листов.
public static IEnumerable<List<int>> Method2(int[] array, int number) { return new List<List<int>> { list1, list2 }; }
-
создайте объект со свойствами для списка и верните его:
public class YourType { public List<int> Prop1 { get; set; } public List<int> Prop2 { get; set; } } public static YourType Method2(int[] array, int number) { return new YourType { Prop1 = list1, Prop2 = list2 }; }
-
возвращает кортеж из двух списков - особенно удобно при работе с В C# 7.0 кортежей
public static (List<int>list1, List<int> list2) Method2(int[] array, int number) { return (new List<int>(), new List<int>()); } var (l1, l2) = Method2(arr,num);
кортежи до C# 7.0:
public static Tuple<List<int>, List<int>> Method2(int[] array, int number) { return Tuple.Create(list1, list2); } //usage var tuple = Method2(arr,num); var firstList = tuple.Item1; var secondList = tuple.Item2;
Я бы пошел на опции 2 или 3 в зависимости от стиля кодирования и где этот код подходит в большей области. Перед C# 7.0 я бы, вероятно, рекомендовал вариант 2.
Способ 1
public static void Method2(int[] array, out List<int> list1, out List<int> list2, int number)
{
list1= new List<int>();
list2= new List<int>();
...
}
Способ 2
public static Tuple<List<int>, List<int>> Method2(int[] array, int number)
{
list1= new List<int>();
list2= new List<int>();
...
return Tuple.Create(list1, list2)
}
Способ 3
создайте класс, который имеет 2 реквизита list1, list 2, верните этот класс или просто верните массив списков
и, наконец, на C# 7 Вы можете просто сделать
public static (List<int> list1, List<int> list2) Method2(int[] array, int number)
{
...
return (list1, list2)
}
Если вы используете более позднюю версию .NET и C#, просто используйте кортежи (вам может потребоваться установить-Package "System.ValueTuple")
public static void Method1()
{
int[] array1 = { };
int number1 = 1;
(List<int> listA, List<int> listB) = Method2(array1, number1);
}
public static (List<int>, List<int>) Method2(int[] array, int number)
{
List<int> list1 = new List<int>();
List<int> list2 = new List<int>();
return (list1, list2); //<--This is where i need to return the second list
}
вы можете посмотреть на структурирование вашего возвращения в Двумерный Массив. По сути, это список списков и может быть представлена в виде графа, где каждая координата содержит значение.
вот пример создания двумерного массива, добавления значения в точку [0,2], а затем получения его значения из этой точки и записи его на экран:
double[,] myNumbers = new double[4, 3];
myNumbers[0, 2] = 21.2;
Console.WriteLine(myNumbers[0,2]);
выход: 21.2
вы должны передать оба желаемых списка в качестве ссылки на вызывающую функцию. Например
public static void Method1()
{
List<int> listA, listB;
Method2(array1, number1, ref listA, ref listB);
}
public static void Method2(int[] array, int number, ref List<int> listA, ref List<int> listB)
{
//...do stuff here
listA.Add(array[value]);
listB.Add(array[value]);
}
лучшая практика IMO будет передавать два списка в ваш желаемый метод и инициализировать / назначать их из самого метода. Пример:
public static void Method2(int[] arr, List<int> list1, List<int> list2)
{
list1 = arr.OfType<int>().ToList();
list2 = arr.OfType<int>().ToList();
}