web-dev-qa-db-fra.com

Renvoyer deux listes en C #

Je fais des recherches à ce sujet depuis un certain temps et je ne sais toujours pas comment le mettre en œuvre et quel est le meilleur moyen de renvoyer deux listes à partir d'une méthode distincte.

Je sais qu'il existe des questions similaires, mais elles semblent se contredire en ce qui concerne la meilleure façon de procéder. J'ai besoin d'une solution simple et efficace à mon problème ... Merci d'avance.

6
L. Full

Il y a beaucoup de façons.

  1. Retourne une collection des listes. Ce n'est pas une bonne façon de le faire, sauf si vous ne connaissez pas le nombre de listes ou s'il s'agit de plus de 2 ou 3 listes.

    public static IEnumerable<List<int>> Method2(int[] array, int number)
    {
        return new List<List<int>> { list1, list2 };
    }
    
  2. Créez un objet avec des propriétés pour la liste et renvoyez-le:

    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 };
    }
    
  3. Renvoyer un tuple de deux listes - particulièrement pratique si vous travaillez avec des tuples 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);
    

    Tuples avant 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;
    

Je choisirais les options 2 ou 3 en fonction du style de codage et de la place de ce code dans le champ d'application le plus large. Avant C # 7.0, je recommanderais probablement l’option 2.

16
Gilad Green

Si vous utilisez une version ultérieure de .NET et C #, utilisez simplement des n-uplets (vous devrez peut-être installer le 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
}
2
Digvijay

Méthode 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>();
    ...
}

Méthode 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)
}

Méthode 3

Créez une classe qui a 2 props list1, list 2, retournez cette classe ou retournez simplement un tableau de listes

et enfin sur le C # 7, vous pouvez simplement faire

public static (List<int> list1, List<int> list2) Method2(int[] array, int number)
{
    ...
    return (list1, list2)
}
2
Arsen Mkrtchyan

Vous devez transmettre les deux listes souhaitées en tant que référence à la fonction appelante. Par exemple

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]);
}
1
Naeem Ur Rehman

Vous pourriez envisager de structurer votre déclaration dans un tableau Two Dimensional Array . Il s’agit essentiellement d’une liste de listes pouvant être visualisée sous forme de graphique où chaque "coordonnée" contient une valeur.

Voici un exemple de création d'un tableau à 2 dimensions, ajoutant une valeur au point [0,2], puis obtenant sa valeur à partir de ce point et l'écrivant à l'écran:

double[,] myNumbers = new double[4, 3];
myNumbers[0, 2] = 21.2;
Console.WriteLine(myNumbers[0,2]);

Sortie: 21.2

1
ThrowingSpoon

Une meilleure pratique consiste à transmettre deux listes à la méthode de votre choix et à les initialiser/les assigner depuis la méthode elle-même ..

public static void Method2(int[] arr, List<int> list1, List<int> list2)
{
    list1 = arr.OfType<int>().ToList();
    list2 = arr.OfType<int>().ToList();
}
1
Tommy Naidich