srd@5 Ответов: 2

Как вернуть список из одного метода в другой?


Привет, я новичок в c#. Я пытаюсь написать код для печати всех возможных перестановок данной строки. Я использовал Список для хранения всех возможных перестановок. Я не могу вернуть список в метод Main () из другого метода. Пожалуйста, помогите мне понять проблему в моем коде.

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        string a = Console.ReadLine();
        List<string> b = new List<string>();
        b = Permutation.Perm("", a);
        foreach(string i in b)
        {
           Console.WriteLine(i); 
        }
        Console.ReadLine();
    }
}
public class Permutation
{
    public static List<string> Perm(string a,string b)
    {
        List<string> c = new List<string>();
        int l = b.Length;
        if(l==0)
        {
            c.Add(a);
        }
        else
        {
            for (int i = 0; i < l; i++)
            {
                string d = b.Substring(0, i) + b.Substring(i+1,l - (i + 1));
                Perm(a + b[i], d);
            }
        }
        return c;
    }
}

CHill60

На первый взгляд выглядит нормально - в чем проблема?

srd@5

Список ' b ' в методе Main () остается пустым. Он не обновляется вместе с возвращенным списком.

2 Ответов

Рейтинг:
14

OriginalGriff

Код, который вы показываете, должен работать, но только если вы добавляете строки в свой список. Чего вы не делаете-потому что ваш метод рекурсивен, и вы добавляете свои строки в текущую версию списка и возвращаете его, но вы ничего не делаете с этим возвращаемым значением, когда ваш рекурсивный вызов завершается.
Это изменится, если вы сделаете это вместо этого:

c.AddRange(Perm(a + b[i], d));


srd@5

Не могли бы вы сообщить мне, где будет добавлен c.AddRange(Perm(a + b[i], d));

OriginalGriff

Вместо

Пермь (a + b[i], d);

srd@5

Спасибо. Это было очень полезно.

OriginalGriff

Пожалуйста!

Рейтинг:
10

F-ES Sitecore

В вашем методе перестановки вы создаете новый экземпляр List & lt;string>, Чтобы добавить результаты и вернуть их, поэтому каждый раз, когда вы добавляете что-то в перестановку, вы добавляете его в новый новый список, так что вы всегда получаете только последнюю добавленную вещь. Вместо того чтобы каждый раз создавать новый список, вы должны передать свой текущий список в функцию перестановки, чтобы его можно было изменить

class Program
{
    static void Main()
    {
        string a = Console.ReadLine();
        List<string> b = new List<string>();
        b = Permutation.Perm("", a, b);
        foreach (string i in b)
        {
            Console.WriteLine(i);
        }
        Console.ReadLine();
    }
}

public class Permutation
{
    public static List<string> Perm(string a, string b, List<string> c)
    {
        int l = b.Length;
        if (l == 0)
        {
            c.Add(a);
        }
        else
        {
            for (int i = 0; i < l; i++)
            {
                string d = b.Substring(0, i) + b.Substring(i + 1, l - (i + 1));
                c = Perm(a + b[i], d, c);
            }
        }
        return c;
    }
}


Однако было бы проще просто сделать что-то вроде этого

class Program
{
    static void Main()
    {
        string a = Console.ReadLine();
        List<string> b = new List<string>();
        Permutation.Perm("", a, b);
        foreach (string i in b)
        {
            Console.WriteLine(i);
        }
        Console.ReadLine();
    }
}

public class Permutation
{
    public static void Perm(string a, string b, List<string> c)
    {
        int l = b.Length;
        if (l == 0)
        {
            c.Add(a);
        }
        else
        {
            for (int i = 0; i < l; i++)
            {
                string d = b.Substring(0, i) + b.Substring(i + 1, l - (i + 1));
                Perm(a + b[i], d, c);
            }
        }
    }
}


Это использует тот факт, что ваш список является объектом в памяти, поэтому вам действительно не нужно возвращать его после обновления, функция перестановки просто нуждается в ссылке на него, и любой элемент, добавленный в список, виден любой переменной, ссылающейся на этот список, который включает "b" в вашу основную функцию.

Вы также должны выбрать лучшие имена для своих переменных, вы уже можете видеть, что ваша схема именования вызовет путаницу, а "а", "в" и " с " означают разные вещи в разных функциях.


srd@5

Спасибо за помощь.