2 / 2 / 0
Регистрация: 31.03.2012
Сообщений: 45
1

Обращение к переменной через динамическую генерацию ее имени

22.08.2018, 18:35. Показов 2884. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Предположим у нас есть 10 переменных.
C#
1
string s1,s2,s3,s4....,s10;
Как в цикле обратиться к этим переменным чтобы не писать каждую из них в ручную.
C#
1
2
3
for (int i = 1; i < 11; i++){
    s... = "Any data";
}
Я понимаю что здесь можно использовать массив но интересует именно как обратиться к переменной через динамическую генерацию ее имени.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2018, 18:35
Ответы с готовыми решениями:

Обращение к классу через значение переменной, т.е. по имени в строковом представлении
К примеру есть переменная str типа string со значением &quot;myClass&quot;. Как обратиться к классу myClass...

Обращение к переменной по ее строковому имени с++
Работаю с не совсем обычным типом данных, нужен был массив переменных данного типа, но из-за...

Обращение к переменной по его имени
Всем привет. Не смог найти, как можно обратиться к массиву, если его имя лежит в другой...

Обращение к переменной по имени в представлении строки
Я даже не представляю, как это можно обьяснить ,чтобы понять. Есть цикл, в нем перебирается скроки...

21
Эксперт .NET
10538 / 6466 / 1502
Регистрация: 25.05.2015
Сообщений: 19,598
Записей в блоге: 14
22.08.2018, 18:50 2
C#
1
string []s = new string[10];
Добавлено через 3 минуты
Цитата Сообщение от Painkiller_13 Посмотреть сообщение
как обратиться к переменной через динамическую генерацию ее имени
Нафига? Чтобы при переименовании переменной в одном месте, код упал при выполнении в другом месте, потому что это не отслеживается?
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
22.08.2018, 18:51 3
Никак. Вы или используете динамику или не используете. Ваш пример можно записать так:
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
using System;
using System.Dynamic;
 
namespace ConsoleApp7
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic s = new ExpandoObject();
 
            s.s1 = 12;
            s.s2 = 13;
            s.s3 = 14;
 
            var summ = 0;
 
            foreach (var item in s)
            {
                summ += item.Value;
            }
 
            Console.WriteLine(summ);
            Console.ReadKey();
        }
    }
}
Но учитывайте, что такой стиль влечет накладные расходы ресурсов и в критичном к производительности коде не должен применяться.
0
296 / 125 / 106
Регистрация: 30.10.2015
Сообщений: 690
23.08.2018, 11:17 4
Цитата Сообщение от Painkiller_13 Посмотреть сообщение
Предположим у нас есть 10 переменных.
Думаю, Вам нужен массив)
0
82 / 60 / 17
Регистрация: 21.08.2015
Сообщений: 1,075
23.08.2018, 16:04 5
В языке программирования FoxPro это называется макроподстановка, но похоже в C# такого нет.
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
23.08.2018, 19:51 6
Чипс, когда есть динамическое программирование, подстановки смотрятся весьма грустно.
0
самый вменяемый тролль
564 / 52 / 8
Регистрация: 19.09.2012
Сообщений: 193
05.01.2019, 01:43 7
Цитата Сообщение от Rius Посмотреть сообщение
Нафига?
у меня встала задача записать на диск, ну скажем, в файл.txt класс с массивом (сериализовать и десериализовать). А массив целиком не пишется, только построчно.
Цитата Сообщение от freeba Посмотреть сообщение
Никак.
Ну раз ни как, буду распускать массив на 100500 переменных перед записью и собирать их вновь в массив при считывании. Дикий костыль, конечно, но, полагаю, лучше, чем 100500 раз построчно читать/записывать файл.
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,481
05.01.2019, 01:57 8
Цитата Сообщение от Евгений С Посмотреть сообщение
А массив целиком не пишется, только построчно.
Чего?

И почему вас при сериализации/десериализации вообще волнуют строки? Всё автоматически делается, вызвали сериализатор и он за вас всю работа сделал.

Цитата Сообщение от Евгений С Посмотреть сообщение
у раз ни как, буду распускать массив на 100500 переменных перед записью и собирать их вновь в массив при считывании. Дикий костыль, конечно, но, полагаю, лучше, чем 100500 раз построчно читать/записывать файл.
Как это поможет не понятно...
1
самый вменяемый тролль
564 / 52 / 8
Регистрация: 19.09.2012
Сообщений: 193
05.01.2019, 03:27 9
Цитата Сообщение от Someone007 Посмотреть сообщение
и он за вас всю работа сделал.
В итоге пол ночи убил. Можно пример?

C#
1
2
3
4
5
6
7
8
9
10
System.Serializable]
public  class Save : MonoBehaviour {
        public int[] MasSev;
 
        private void Awake()
        {
            Debug.Log("Save");
            MasSev = new int[10];
        }
}
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class Zapis : MonoBehaviour
{
 
 
    GameObject Camera;
    private Save sv;
    public int[] MasSev;
 
    private string path;
 
 
    private void Awake()
    {
       
        
        path = Path.Combine(Application.dataPath, "save.gd");
        if (File.Exists(path))//если есть файл по пути
        {
            sv = JsonUtility.FromJson<Save>(File.ReadAllText(path));
            
            Debug.Log("цифра 1: " + sv.MasSev[0] + "\nцифра 2:" + sv.MasSev[9]);
        }
        else
        {
            Camera = GameObject.Find("Main Camera");
            sv = Camera.GetComponent<Save>();
            Debug.Log("первый sv.MasSev.Length " + sv.MasSev.Length);
        }
        
    }
 
#if UNITY_ANDROID && !UNITY_EDITOR
    private void OnApplicationPause(bool pause)
    {
        if (pause) File.WriteAllText(path, JsonUtility.ToJson(sv));
    }
#endif
    private void OnApplicationQuit()
    {
        Debug.Log("успешно записали ");
        File.WriteAllText(path, JsonUtility.ToJson(sv));
 
    }
 
    public void PishemImya()
    {
        
        Debug.Log("второй sv.MasSev.Length " + sv.MasSev.Length);
        sv.MasSev[0] = 123;
        sv.MasSev[9] = 1;
    }
 
}
Ошибка
ArgumentException: Cannot deserialize JSON to new instances of type 'Save.'

что я делаю не так?

Добавлено через 14 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    private void Awake()
    {
 
        Camera = GameObject.Find("Main Camera");
        sv = Camera.GetComponent<Save>();
        Debug.Log("первый sv.MasSev.Length " + sv.MasSev.Length);
        Debug.Log("Zapis");
        Debug.Log("цифра 1: " + sv.MasSev[0] + "\nцифра 2:" + sv.MasSev[9]);
        path = Path.Combine(Application.dataPath, "saved5.gd");
        if (File.Exists(path))//если есть файл по пути
        {
            sv = JsonUtility.FromJson<Save>(File.ReadAllText(path));
 
            Debug.Log("цифра 1: " + sv.MasSev[0] + "\nцифра 2:" + sv.MasSev[9]);
        }
первый раз даёт нули, после чтения
Object reference not set to an instance of an object
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
05.01.2019, 03:52 10
Открою страшную тайну. На самом деле шарп это не один язык, а целая куча диалектов одого языка под одной маркой. Для веба свой, для винформс свой, для впф тоже свой - юнити не исключение. Нигде кроме юнити не используют для работы с json что-то отличное от newtonsoft.json ибо отраслевой стандарт. Засим не в ту ветку ты пришел за ответом, сюда тебе надобно.
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,481
05.01.2019, 03:58 11
Ни что не мешает в Unity подключить нормальную библиотеку для работы с JSON.

https://www.newtonsoft.com/jso... Object.htm
https://www.newtonsoft.com/jso... Object.htm
0
самый вменяемый тролль
564 / 52 / 8
Регистрация: 19.09.2012
Сообщений: 193
05.01.2019, 04:11 12
Цитата Сообщение от freeba Посмотреть сообщение
целая куча диалектов одого языка под одной маркой
Это да, но мне казалось, в этом вопросе отличия не важны)
Цитата Сообщение от Someone007 Посмотреть сообщение
подключить нормальную библиотеку
Прежде, чем попробую, может поможете с следующим:

C#
1
sv = JsonUtility.FromJson<Save>(File.ReadAllText(path));
пытается sv прочитать по типу класса Save (как я понял)))
Но у класса Save только объявлен массив
C#
1
public int[] MasSev;
А размерность назначается в методе
C#
1
private void Awake()
который не был вызван.
Для его вызова и всё это порево
C#
1
2
Camera = GameObject.Find("Main Camera");
            sv = Camera.GetComponent<Save>();
Вроде, логично, что передаём, в качестве образца (шаблона), класс с нулевой размерностью массива, возвращает с 10-ю элементами и сопоставить не может)
Как создать класс с массивом в 10 элементов сразу?
Можно статический и класс и массив.
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
05.01.2019, 04:22 13
Someone007, ничто не мешает вместо EF подключать NHibernate, но в 90% это чревато повышенной дозой моральных (а иногда и физических) повреждений. Стандарты не на ровном месте формируются. Отступать от них не любят по многим веским причинам.
1
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,481
05.01.2019, 04:27 14
У меня кстати и со стандартной JsonUtility из Unity все работает прекрасно...
Миниатюры
Обращение к переменной через динамическую генерацию ее имени  
1
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,481
05.01.2019, 04:28 15
Цитата Сообщение от freeba Посмотреть сообщение
Отступать от них не любят по многим веским причинам.
Да нет там никаких веских причин...
0
freeba
05.01.2019, 04:31
  #16

Не по теме:

Цитата Сообщение от Someone007 Посмотреть сообщение
Да нет там никаких веских причин...
Тимлиду расскажите, что вам необходимо поменять какую нибудь библиотеку, просто так, для познания нового. Просветление он обеспечит, в форсажном режиме... :D

0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,481
05.01.2019, 04:36 17
Цитата Сообщение от Someone007 Посмотреть сообщение
У меня кстати и со стандартной JsonUtility из Unity все работает прекрасно...
А если поле с массивом поменять на свойство, то работать перестаёт Вот так вот. Лучше уж заюзать нормальную библиотеку без вот таких вот багов...
0
самый вменяемый тролль
564 / 52 / 8
Регистрация: 19.09.2012
Сообщений: 193
05.01.2019, 04:38 18
Someone007,
На скрине не разобрать(((
Скиньте листинг, плиз!!!
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,481
05.01.2019, 04:42 19
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System.IO;
using UnityEngine;
using UnityEngine.UI;
 
public class Save
{
    public int[] Array = new int[10];
    //public int[] Array { get; set; } = new int[10]; // свойства не работают...
}
 
public class ButtonBehaviourScript : MonoBehaviour
{
    Button button1;
    Button button2;
 
    // Start is called before the first frame update
    void Start()
    {
        button1 = GameObject.Find("Button1").GetComponent<Button>();
 
        button1.onClick.AddListener(delegate { Button1_OnClick(); });
 
        button2 = GameObject.Find("Button2").GetComponent<Button>();
 
        button2.onClick.AddListener(delegate { Button2_OnClick(); });
    }
 
    void Button1_OnClick()
    {
        var save = new Save();
        save.Array[0] = 1;
        save.Array[9] = 2;
 
        var json = JsonUtility.ToJson(save);
 
        Debug.Log($"saving: {json}");
 
        File.WriteAllText("save.json", json);
    }
 
    void Button2_OnClick()
    {
        var json = File.ReadAllText("save.json");
 
        Debug.Log($"loading: {json}");
 
        var save = JsonUtility.FromJson<Save>(json);
 
        Debug.Log($"цифра 1: {save.Array[0]}\nцифра 9:{save.Array[9]}");
    }
 
    // Update is called once per frame
    void Update()
    {
        
    }
}
1
самый вменяемый тролль
564 / 52 / 8
Регистрация: 19.09.2012
Сообщений: 193
05.01.2019, 04:48 20
ЫГЫ!!!
Что бы закончить тему оффтопа, нашёл решение на просторах интернетов
Вот такой чудный класс помогает обойти недочёты:

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
public static class JsonHelper
{
    public static T[] FromJson<T>(string json)
    {
        Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
        return wrapper.Items;
    }
 
    public static string ToJson<T>(T[] array)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper);
    }
 
    public static string ToJson<T>(T[] array, bool prettyPrint)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper, prettyPrint);
    }
 
    [System.Serializable]
    private class Wrapper<T>
    {
        public T[] Items;
    }
}
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class Zapis : MonoBehaviour
{
 
 
    private string path;
 
    public int[] MasSev;
    private void Awake()
    {
        MasSev = new int[10];
    
        Debug.Log("первый sv.MasSev.Length " + MasSev.Length);
        Debug.Log("Zapis");
 
        Debug.Log("цифра 1: " + MasSev[0] + "\nцифра 2:" + MasSev[9]);
        path = Path.Combine(Application.dataPath, "saved7.gd");
        if (File.Exists(path))//если есть файл по пути
        {
            int [] MasSev  = JsonHelper.FromJson<int>(File.ReadAllText(path));
 
            Debug.Log("цифра 1: " + MasSev[0] + "\nцифра 2:" + MasSev[9]);
        }
        
    }
 
    //тут сама запись
#if UNITY_ANDROID && !UNITY_EDITOR
    private void OnApplicationPause(bool pause)
    {
        if (pause) File.WriteAllText(path, JsonUtility.ToJson(sv));
    }
#endif
    private void OnApplicationQuit()
    {
        File.WriteAllText(path, JsonHelper.ToJson(MasSev, true));
    }
 
    public void PishemImya()
    {
        
        Debug.Log("второй sv.MasSev.Length " + MasSev.Length);
        MasSev[0] = 123;
        MasSev[9] = 1;
    }
 
}
Спасибо всем, с Наступившим вас, полуночники
0
05.01.2019, 04:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2019, 04:48
Помогаю со студенческими работами здесь

Обращение к имени поля с помощью переменной
Здравствуйте! вопрос как обратиться к полю какому то через переменную т.е. к примеру есть...

Обращение к имени столбца через строковую переменную
Доброго времени суток! Вкратце: программа считает данные, далее автоматически заносит в БД. Во...

Обращение к переменной через класс
Приветствую. Подскажите пожалуйста Имеется следующий класс: class Symbol_table{...

Обращение к элементу массива через значение переменной
Ключ массива хранится в виде значения переменной, например: $key=&quot;&quot; или так $key='' т.е...

Формирование имени переменной с через радиокнопки
Всем доброго времени суток. PHP занялась недавно и вот столкнулась со следующим. Есть форма с...

Нюансы синтаксиса: куда прижимать звёздочку при объявлении указателя - к имени типа или к имени переменной?
Скажите, пожалуйста, в чём отличие таких записей: int *px int* px int *px = new int int *px =...


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

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

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