Каков наилучший способ сохранить матрицу флажков, когда х / у не известны до времени выполнения? - PullRequest
1 голос
/ 20 августа 2010

Мне нужно сохранить флажки в коллекции и получить к ним доступ через матричные координаты .

Следующий пример работает, но только если я заранее знаю размер матрицы , так как используется массив.

Каков наилучший подход / сбор для достижения того же результата, но также позволяющий определять матрицу во время выполнения, например, Dictionary<>, Tuple<>, KeyValuePair<>

alt text

using System;
using System.Windows;
using System.Windows.Controls;

namespace TestDoubarray
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            CheckBox[,] checkBoxes = new CheckBox[10, 10];

            for (int x = 0; x < 10; x++)
            {
                for (int y = 0; y < 10; y++)
                {
                    CheckBox cb = new CheckBox();
                    cb.Tag = String.Format("x={0}/y={1}", x, y);
                    checkBoxes[x,y] = cb;
                }
            }

            CheckBox cbOut = checkBoxes[4, 8];
            Message.Text = cbOut.Tag.ToString();
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Вы можете создать структуру, содержащую координаты в качестве ключа, и использовать ее в словаре.

struct CheckBoxCoord{
 public int X{get;set;}
 public int Y{get;set;}
}


Dictionary<CheckBoxCoord,CheckBox> m_map=new Dictionary<CheckBoxCoord,CheckBox>();

Смотрите также здесь , если хотите узнать, как их непосредственно найти.

1 голос
/ 20 августа 2010

Вы все еще можете использовать массив, даже если вы не знаете его размеры до времени выполнения, используя его метод GetUpperBound, чтобы найти, например, размер;

int x_len = 13; // x_len and y_len can be any size >= 0
int y_len = 11;

CheckBox[,] checkBoxes = new CheckBox[x_len, y_len];

for (int x = 0; x <= checkBoxes.GetUpperBound(0); x++)
{
    for (int y = 0; y <= checkBoxes.GetUpperBound(1); y++)
    {
        CheckBox cb = new CheckBox();
        cb.Tag = String.Format("x={0}/y={1}", x, y);
        checkBoxes[x, y] = cb;
    }
}

CheckBox cbOut = checkBoxes[4, 8];
0 голосов
/ 20 августа 2010

Словарь - это класс, предназначенный для такого рода ситуаций, и я бы выбрал его.

В общем, я бы избегал кортежей даже для использования в качестве индекса. (Я всегда чувствовал, что всякий раз, когда вы можете использовать кортеж, вы должны использовать структуру. Пример HCL может использовать 2-кортеж вместо структуры в качестве ключа .. ... но тогда вы теряете способность называть X и Y ко-орды, но без усиления.)

KeyValuePair наиболее полезна, когда у вас уже есть словарь, и вы хотите его перечислить или иным образом работать с элементами словаря в паре.

...