Матрица C #, основанная на значениях столбцов и строк - PullRequest
4 голосов
/ 14 июня 2011

Я хочу создать структуру данных ac #, которая будет иметь переменное количество столбцов и переменное количество строк.Я вставлю значения в «ячейки».Я хочу иметь возможность индексировать столбцы и строки, используя строки, а не целые числа, чтобы я мог обращаться к этим ячейкам следующим образом: infotable ("pete", "monday") = 3 или infotable ("mike", "пятница ") ++.Когда я сталкиваюсь с именем столбца или именем строки, которое еще не существует, я добавляю его в структуру.

Я размышлял об использовании вложенных коллекций, но тогда у меня не будет гарантии, что каждая вложенная коллекция будет содержать те же ключи, что и все другие вложенные коллекции (если я не управляю вещами вручную).Я размышлял об использовании DataTables, но тогда я не могу индексировать строки, используя строки.

Какой самый подходящий способ удовлетворить мое требование?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 14 июня 2011

На ум приходят два решения:

  1. Используйте таблицу базы данных, состоящую из двух частей строкового ключа и поля значения.Это самое масштабируемое решение, но также и «самое тяжелое».

  2. Создайте простую структуру StringPair, которая принимает две строки (давая значащему имени классу и членам для вашего приложения),реализовать равенство и генерацию хеш-кода (возможно, можно просто XOR хеш-коды из двух строк), а затем использовать простой словарь, связанный с этим StringPair.

1 голос
/ 14 июня 2011

следующий пример кода будет делать то, что вы хотите:

public class InfoTable
    {
        Dictionary<string, int> _collection;
        public InfoTable()
        {
            _collection = new Dictionary<string,int>();
        }

        public int this[string col,string row] {

            get
            {
                string colrow = col+"_"+row;
                if (_collection.ContainsKey(colrow))
                    return _collection[colrow];
                _collection.Add(colrow, 0);
                return 0;
            }
            set
            {
                string colrow = col + "_" + row;
                if (_collection.ContainsKey(colrow))
                    _collection[colrow] = value;
                else
                    _collection.Add(colrow, value);
            }
        }
    }

и вот как вы его используете:

InfoTable it = new InfoTable();
it["mike", "friday"] = 1;
it["mike", "friday"]++;
int val = it["mike", "friday"];
1 голос
/ 14 июня 2011

Что если вы расширите DataTable и добавите свои собственные функции для «индексации» строк за строкой?Вы можете использовать метод (ы) в качестве оболочки для чего-то вроде DataTable.Select

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...