10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
1

Инициализация константного массива из элементов кортежа

21.10.2016, 20:13. Показов 3760. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как правильно создать константный массив из элементов кортежа?
(я пробовал создать не константный)
в результате должно получиться примерно следующее:
C#
1
2
3
4
5
6
7
8
9
10
11
        private Tuple<string, bool>[] CommandList = new Tuple<string, bool>[]
        {
            { "MEMINC", true },
            { "MEMDEC", true },
            { "BYTEINC", true },
            { "BYTEDEC", true },
            { "OUTPUT", false },
            { "INPUT", false },
            { "WHILE", false },
            { "END", false }
        };
Пробовал с помощью object, но не понял как потом используя foreach извлечь нулевой элемент типа string и первый элемент типа bool.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        private object[,] CommandList =
        {
            { "MEMINC", true },
            { "MEMDEC", true },
            { "BYTEINC", true },
            { "BYTEDEC", true },
            { "OUTPUT", false },
            { "INPUT", false },
            { "WHILE", false },
            { "END", false }
        };
 
        private bool ValueRequired(string command)
        {
            foreach (object element in CommandList)
            {
               //
            }
            return false;
        }
Еще неплохо было бы если бы пояснили что значит запятая в [] и обязательно ли создавать нужный мне массив\тип данных через new.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2016, 20:13
Ответы с готовыми решениями:

Инициализация элементов массива
В C# новичок) Программа, задающая массив с numericUpDown и суммирующая его...

Инициализация константного статического объекта - члена класса
Здравствуйте, у меня возникла проблема с инициализацией статического объекта, который является...

Инициализация константного члена класса с проверкой значения
Допустим есть класс константным членом class a{ const int i; public: a(int...

Инициализация элементов массива в конструкторе
Доброго времени суток! Подскажите пожалуйста можно ли инициализировать элементы массива при помощи...

9
.NET senior
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
21.10.2016, 20:29 2
drunkwolfs, через операцию new обязательно, т. к. именно с её помощью выделяется память для размещения создаваемого объекта (в упрощённом виде).

для создания экземпляров Tuple есть удобные статические методы, объявленные в неуниверсальном классе Tuple:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Tuple<string, bool>[] CommandList = new Tuple<string, bool>[] // 1
    {
        Tuple.Create("MEMINC", true), // 2
        Tuple.Create("MEMDEC", true),
        Tuple.Create("BYTEINC", true),
        Tuple.Create("BYTEDEC", true),
        Tuple.Create("OUTPUT", false),
        Tuple.Create("INPUT", false),
        Tuple.Create("WHILE", false),
        Tuple.Create("END", false)
    };
 
// 1 - тут запятая нужна, потому что это синтаксис объявления Tuple<string, bool>
// 2 - тут запятая нужна, потому что мы перечисляем элементы массива
Добавлено через 10 минут
Цитата Сообщение от drunkwolfs Посмотреть сообщение
запятая в []
если Вы имели в виду вот такое:

C#
1
int[,] someArray = new int[10, 10];
то это создание двумерного массива целых чисел с указанным количеством строк и столбцов соответственно
1
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
21.10.2016, 21:04  [ТС] 3
Самое простое и очевидное решение, но у меня от него кровь из глаз
Цитата Сообщение от bax_tang Посмотреть сообщение
C#
1
2
3
4
5
Tuple<string, bool>[] CommandList = new Tuple<string, bool>[] // 1
    {
        Tuple.Create("MEMINC", true), // 2
        Tuple.Create("MEMDEC", true),
...
Каждый раз вызывать метод Create...
Неужели в шарпе сложно при инициализации массива из элементов кортежа установить каждому из них значения?
вот так:
C#
1
2
3
4
5
6
7
8
9
10
        {
            { "MEMINC", true },
            { "MEMDEC", true },
            { "BYTEINC", true },
            { "BYTEDEC", true },
            { "OUTPUT", false },
            { "INPUT", false },
            { "WHILE", false },
            { "END", false }
        };
0
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
21.10.2016, 21:16 4
drunkwolfs, если картеж это не "панацея", то есть куча других вариантов, вот пара из них:
Dictionary:
C#
1
2
3
4
5
6
7
8
9
10
11
     Dictionary<string,bool> dictionary = new Dictionary<string, bool>
         {
            { "MEMINC", true },
            { "MEMDEC", true },
            { "BYTEINC", true },
            { "BYTEDEC", true },
            { "OUTPUT", false },
            { "INPUT", false },
            { "WHILE", false },
            { "END", false }
        };
C#
1
2
3
4
5
6
7
8
9
10
11
     Dictionary<string,bool> dictionary = new Dictionary<string, bool>
         {
            ["MEMINC"] = true,
            ["MEMDEC"] = true,
            ["BYTEINC"] = true,
            ["BYTEDEC"] = true ,
            ["OUTPUT"] = false,
            ["INPUT"] = false,
            ["WHILE"] = false,
            ["END"] = false
        };
Или список класса
C#
1
2
3
4
5
class DataExample
{
 public string Par1 {get;set;}
 public bool Par2 {get;set;}
}
1
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
21.10.2016, 23:10  [ТС] 5
Решил написать свой класс, выполняющий примерно тоже самое что и Dictionary, но для 3-х элементов т.к. в этом появилась необходимость.
Создаю объект вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
MyList<string, bool, string> CommandList = new MyList<string, bool, string>
         {
            { "MEMINC",     true,   ">" },
            { "MEMDEC",     true,   "<" },
            { "BYTEINC",    true,   "+" },
            { "BYTEDEC",    true,   "-" },
            { "OUTPUT",     false,  "." },
            { "INPUT",      false,  "," },
            { "WHILE",      false,  "[" },
            { "END",        false,  "]" }
        };
Класс MyList с пустыми методами:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class MyList<TName, TValue, TCode>: IEnumerable, IEnumerator
    {
        public IEnumerator GetEnumerator()
        {
            return (IEnumerator)this;
        }
        public void Reset()
        {
        }
        public object Current
        {
            get
            {
                return null;
            }
        }
        public bool MoveNext()
        {
            return false;
        }
        public void Add(TName Name, TValue Value, TCode Code)
        {
        }
    }
Компилируется, уверен что не работает, потому что я понятия не имею что писать в методы класса MyList.
Может кто нибудь видел пример Dictionary для 3-х элементов?
0
960 / 481 / 241
Регистрация: 02.06.2016
Сообщений: 755
22.10.2016, 10:21 6
drunkwolfs,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyList<TName, TValue, TCode> : IEnumerable
{
    Dictionary<Tuple<TName, TValue>, TCode> data = new Dictionary<Tuple<TName, TValue>, TCode>();
    public void Add(TName Name, TValue Value, TCode Code)
    {
        this[Name, Value] = Code;
    }
 
    public TCode this[TName Name, TValue Value]
    {
        get { return data[Tuple.Create(Name, Value)]; }
        set { data[Tuple.Create(Name, Value)] = value; }
    }
 
    public IEnumerator GetEnumerator()
    {
        return (IEnumerator)data;
    }
}
Добавлено через 9 минут
еще через расширения можно:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
static class DictionaryExt
{
    static void Add<TKey, TValue, TCode> (this Dictionary<Tuple<TKey, TValue>, TCode> Dict, TKey Key, TValue Value, TCode Code)
    {
        Dict[Tuple.Create(Key, Value)] = Code;
    }
 
    static TCode GetCode<TKey, TValue, TCode>(this Dictionary<Tuple<TKey, TValue>, TCode> Dict, TKey Key, TValue Value)
    {
        return Dict[Tuple.Create(Key, Value)];
    }
 
    static void Main()
    {
        var CommandList = new Dictionary < Tuple<string, bool>, string>()
        {
            { "MEMINC",     true,   ">" },
            { "MEMDEC",     true,   "<" },
            { "BYTEINC",    true,   "+" },
            { "BYTEDEC",    true,   "-" },
            { "OUTPUT",     false,  "." },
            { "INPUT",      false,  "," },
            { "WHILE",      false,  "[" },
            { "END",        false,  "]" }
        };
 
        Console.WriteLine(CommandList.GetCode("MEMINC", true));
        Console.ReadLine();
    }
}
1
.NET senior
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
22.10.2016, 10:23 7
drunkwolfs, Вы хотели сказать "для двух ключей и значения"? нет ничего проще - вложенные Dictionary должны помочь:

C#
1
Dictionary<TName, Dictionary<TCode, TValue>> storage = new;
соответственно в методе Add работаете сразу с двумя вложенными словарями, создавая их в случае отсутствия и добавляя связку ключи - значение
1
Aael
22.10.2016, 10:30
  #8

Не по теме:

Цитата Сообщение от bax_tang Посмотреть сообщение
создавая их в случае отсутствия
ТС себе тогда точно глаза вырвет =)

0
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
24.10.2016, 20:11  [ТС] 9
Создал 2 класса.
Первый класс - кортеж:
C#
1
2
3
4
5
6
7
8
9
10
11
12
    class MyListElement<TName, TValue, TCode>
    {
        public TName MyName { get; }
        public TValue MyValue { get; }
        public TCode MyCode { get; }
        public MyListElement(TName Myname, TValue Myvalue, TCode Mycode)
        {
            MyName = Myname;
            MyValue = Myvalue;
            MyCode = Mycode;
        }
    }
Второй класс - массив кортежа:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    class MyList<TName, TValue, TCode>: IEnumerable
    {
        public List<MyListElement<TName, TValue, TCode>> MyTElement = new List<MyListElement<TName, TValue, TCode>> { };
        public IEnumerator GetEnumerator()
        {
            return (IEnumerator)this;
        }
        public void Reset()
        {
        }
        public int GetLength()
        {
            return MyTElement.Count;
        }
        public object Current
        {
            get
            {
                return null;
            }
        }
        public bool MoveNext()
        {
            return false;
        }
        public void Add(TName Name, TValue MyValue, TCode Code)
        {
            MyTElement.Add(new MyListElement<TName, TValue, TCode>(Name, MyValue, Code));
        }
    }
Заполняю вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
        MyList<string, bool, string> CommandList = new MyList<string, bool, string>
         {
            { "MEMINC",     true,   ">" },
            { "MEMDEC",     true,   "<" },
            { "BYTEINC",    true,   "+" },
            { "BYTEDEC",    true,   "-" },
            { "OUTPUT",     false,  "." },
            { "INPUT",      false,  "," },
            { "WHILE",      false,  "[" },
            { "END",        false,  "]" }
        };
Перебираю так:
C#
1
2
3
4
5
6
7
        private bool ValueRequired(string command)
        {
            foreach (MyListElement<string, bool, string> element in CommandList)
                if(String.Compare(element.Name, command) == 0)
                    return element.Value;
            return false;
        }
Добавлено через 17 минут
Почти работает. Массив точно заполняется, а вот доступ к элементам пока получить не удается. Завтра постараюсь подправить.
0
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
28.10.2016, 18:36  [ТС] 10
Лучший ответ Сообщение было отмечено vavun как решение

Решение

Jeff Mercado:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static class TupleListExtensions
    {
        public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
                T1 item1, T2 item2)
        {
            list.Add(Tuple.Create(item1, item2));
        }
 
        public static void Add<T1, T2, T3>(this IList<Tuple<T1, T2, T3>> list,
                T1 item1, T2 item2, T3 item3)
        {
            list.Add(Tuple.Create(item1, item2, item3));
        }
        public static void Add<T1, T2, T3, T4>(this IList<Tuple<T1, T2, T3, T4>> list,
                T1 item1, T2 item2, T3 item3, T4 item4)
        {
            list.Add(Tuple.Create(item1, item2, item3, item4));
        }
 
        // and so on...
    }
C#
1
2
3
4
5
6
7
8
List<Tuple<int, string, int>> numbers = new List<Tuple<int, string, int>>
{
    { 1, "one", 1},
    { 2, "two", 1 },
    { 3, "three", 2 },
    { 4, "four", 3 },
    { 5, "five", 4 },
};
0
28.10.2016, 18:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2016, 18:36
Помогаю со студенческими работами здесь

Инициализация константных элементов класса и массива
CodeGear C++ Builder 2007. Хотелось бы объявить в классе (т.е. как элемент класса) обычный массив...

Добрый вечер! Передача в функцию константного значения и обьявление им массива
Вот у меня есть функция с объявленым массивом внутри: f(const int &amp;C) { int mass; } Где тут...

Конвертация строки/кортежа/массива в целое число. Работа с базой
Дано: В базе MySQL имеется таблица со строчными и числовыми значениями. Надо: Достать из базы...

Использование элементов списка или кортежа ровно один раз
Вопрос, как сделать так, чтобы все элементы списка или кортежа использовались только один раз....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru