在c#中填充哈希表并在aTextBox中显示

本文关键字:aTextBox 显示 填充 哈希表 | 更新日期: 2023-09-27 18:07:04

我试图填充一个哈希表,关键只是一个数字ID和内容整数数组。我无法在文本框中显示它,我认为问题来自于填充和显示。

填充代码为:

        Hashtable map = new Hashtable();
        for (int cooX = 0, cont = 0 ; cooX < maxX; cooX++)
        {
            for (int cooY = 0; cooY < maxY; cooY++)
            {
                for (int cooZ = 0; cooZ < maxZ; cooZ++)
                {
                    coordinate[0] = 0 + cooX;
                    coordinate[1] = 0 + cooY;
                    coordinate[2] = 0 + cooZ;
                    map.Add(cont, coordinate);
                    cont++;
                }
            }
        }

显示部分为:

        foreach ( DictionaryEntry i in map )
        {
            TextBox txt = new TextBox();
            txt.AppendText(i.Key + " : " + i.Value);
            MainGrid.Children.Add(txt);
        }

文本框显示:

"0:系统。Int32 [] "

谢谢大家。

编辑:哇,这对我来说是不可思议的愚蠢,我已经改变了我的代码,所以它现在有效地显示了哈希表,只是通过在for之前声明TextBox并在它之后显示它。

新代码为:

        TextBox txt = new TextBox();
        foreach ( DictionaryEntry i in map )
        {
            txt.AppendText(i.Key + " : " + i.Value + "'n");
        }
        MainGrid.Children.Add(txt);

所以这一定是一个转换问题。我现在去查一下,很抱歉犯了这么大的错误。

新输出为:

(…)3: System。Int32 []2: System。Int32 []1: System。Int32 []0:系统。Int32 []

循环的新代码,由下面的msmolcic提供,是:

foreach ( DictionaryEntry i in map )
{
int[] coords = (int[])i.Value;
txt.AppendText(string.Format("{0} : [ x={1}, y={2}, z={3} ]'n", i.Key, coords[0], coords[1], coords[2]));
}

现在显示如下,仍然是坏的:

4 : [ x=4, y=4, z=4 ]
3 : [ x=4, y=4, z=4 ]
2 : [ x=4, y=4, z=4 ]
1 : [ x=4, y=4, z=4 ]
0 : [ x=4, y=4, z=4 ]

在c#中填充哈希表并在aTextBox中显示

对地图中的所有元素使用相同的坐标实例。所以在每次迭代中,你重写它的内容你必须每次都创建一个新的实例,它会解决你的问题

编辑

如果您想拥有更干净的代码,我建议您使用面向OO的方法并定义自己的Coordinate类。然后可以重写ToString方法。如果可能的话,还应该用字典替换Hashtable,因为这个类型为

var dict = new Dictionary<int, Coordinate>();
var count = 0;
for (var cooX = 0; cooX < 2; cooX++)
{
    for (var cooY = 0; cooY < 2; cooY++)
    {
        for (var cooZ = 0; cooZ < 2; cooZ++)
        {
            dict.Add(count++, new Coordinate { X = cooX, Y = cooY, Z = cooZ });
        }
    }
}
TextBox txt = new TextBox();
foreach (var i in dict)
{
    var coord = i.Value;
    txt.AppendText(string.Format("{0} : {1}'n", i.Key, coord));
}
MainGrid.Children.Add(txt);
坐标:

class Coordinate
{
    public int X { get; set; }
    public int Y { get; set; }
    public int Z { get; set; }
    public override string ToString()
    {
        return string.Format("[ x={0}, y={1}, z={2} ]", X, Y, Z);
    }
}

如果你已经在VS2015上,你也可以使用字符串插值来替换字符串。使用更易读的语法格式化:

    public override string ToString()
    {
        return $"[ x={X}, y={Y}, z={Z} ]";
    }

scroll和msmolcic在同一线程中都有正确的解决方案修复,他们每个人都有一个问题。因此,为了保持简洁,我将在这里发布最终代码。如果有人提出更好、更简洁的代码,我会选择你的答案作为更好的解决方案:

        Hashtable map = new Hashtable();
        TextBox txt = new TextBox();
        int[] coordinate = new int[3];
        for (int cooX = 0, cont = 0; cooX < 2; cooX++)
        {
            for (int cooY = 0; cooY < 2; cooY++)
            {
                for (int cooZ = 0; cooZ < 2; cooZ++)
                {
                    coordinate[0] = 0 + cooX;
                    coordinate[1] = 0 + cooY;
                    coordinate[2] = 0 + cooZ;
                    int[] coo = new int[3] { coordinate[0], coordinate[1], coordinate[2] };
                    map.Add(cont, coo);
                    cont++;
                }
            }
        }
        foreach (DictionaryEntry i in map)
        {
            int[] coords = (int[])i.Value;
            txt.AppendText(string.Format("{0} : [ x={1}, y={2}, z={3} ]'n", i.Key, coords[0], coords[1], coords[2]));
        }
        MainGrid.Children.Add(txt);