在第1课中创建一个2d列表,在第2课中填写并在第3课

时间:2017-02-02 15:02:54

标签: c# class uwp nested-lists

正如标题所暗示的那样,我已经制作/初始化了/在Class 1中的任何2D列表,我在第2课中填充了它,并尝试在第3类中使用它的内容。

但是,在填写第2类中的列表(我已经确认它已被填充)之后,当在类3中调用要使用该类的方法时,它只是空的,我不知道为什么。< / p>

第1类

class class1
{
    public List<List<String>> playerInfo = new List<List<String>>();
    //it's a 2D list but as far as I know that shouldn't be a problem

第2类

public sealed partial class class2: Page
{
    class1 host = new class1();

    private void joinButton_Click(object sender, RoutedEventArgs e)
    {
        if (host.playerInfo.Count() <= 4)
        {

            //fill list             

到目前为止似乎还行。如果我做一个Count它会显示它包含2个元素,很酷。

第3类

public sealed partial class MainPage : Page
{

    GameHost host = new GameHost();

    public void Init()
    {

        if (host.playerInfo.Count() >= 2)
        {
            //Do stuff
         }
    }
}

然而,这里的清单只是空的。 Count只返回0。

这可能是什么?

如果我在这里的例子不是很清楚,请告诉我,我对这个Stack Overflow的事情还不是很好。

3 个答案:

答案 0 :(得分:0)

无论如何,共同的根本原因是覆盖列表引用。 请参阅下面的简单示例:

static void Main()
{
            List<int> mainList = new List<int>();
            UpdateList(mainList);
            Console.WriteLine(mainList.Count); // prints 0
}

private static void UpdateList(List<int> numbers)
{
            numbers = new List<int>();
            numbers.Add(1);
            numbers.Add(2);
            Console.WriteLine(numbers.Count); // prints 2
}

列表引用在UpfdateList函数中传输。使用new关键字在UpfdateList中执行第一行后,您从main中丢失了对列表的引用,现在引用是在UpfdateList中创建的新列表。

要修复它,请不要覆盖列表引用:

private static void UpdateList(List<int> numbers)
{
                //numbers = new List<int>(); remove that
                numbers.Add(1);
                numbers.Add(2);
                Console.WriteLine(numbers.Count); // prints 2. 'numbers' still holds the reference the the list from the main 
}

另外,请确保在Class2和Class3中使用相同的Class1实例。

答案 1 :(得分:0)

问题是您在MainPage类中创建了一个新实例。此实例在列表中没有值。您只需将实例作为参数传递给Init方法:

public sealed partial class MainPage : Page
{    
    public void Init(GameHost host)
    {    
        if (host.playerInfo.Count() >= 2)
        {
            //Do stuff
        }
    }
}

如果要在整个GameHost类中使用MainPage实例,您还可以将其传递给构造函数并初始化字段,如下所示:

public sealed partial class MainPage : Page
{
    GameHost host;

    public MainPage (GameHost _host)
    {    
        host = _host;
    }
}

现在它可以在类中使用你之前拥有的所有初始化值。

public sealed partial class MainPage : Page
{
    GameHost host;

    public MainPage (GameHost _host)
    {    
        host = _host;
    }

    public void Init(GameHost host)
    {    
        if (host.playerInfo.Count() >= 2) // now it should have the desired items
        {
            //Do stuff
        }
    }
}

答案 2 :(得分:0)

我将如何做到这一点。

App.xaml.cs on App Launch

中初始化2D列表
private static List<List<String>> _playerInfo;
public static List<List<String>> PlayerInfo
{
    get
    {
        return (_playerInfo == null) ? new List<List<string>>() : _playerInfo;
    }
    set { _playerInfo = value; }
}

现在没有必要上课。

class2

public sealed partial class class2 : Page
{
    private void joinButton_Click(object sender, RoutedEventArgs e)
    {
        if (App.PlayerInfo.Count <= 4)
        {
            // Fill your List Here
        }
    }
}

MainPage将是

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        if (App.PlayerInfo.Count >=2)
        {
            // Do Stuff.
        }
    }
}