powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Генерный список.
28 сообщений из 28, показаны все 2 страниц
Генерный список.
    #40014731
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть списки классов.
Код: c#
1.
2.
3.
List<Params> parameters = new List<Params>();
List<InOut> inouts = new List<InOut>();
List<Sensor> sensors = new List<Sensor>();


Мне нужно передать список в качестве аргумента. Есть какой то генерик список на который можно сделать каст?
Код: c#
1.
2.
3.
void MyMethod(List<T> generic_list)
{
}


В C я могу сделать войдовый указатель и делать каст на аргумент.
Код: c#
1.
2.
3.
4.
5.
6.
7.
void Foo(void *var)
{
}

Foo((uint8_t *)var);
Foo((uint16_t *)var);
Foo((uint32_t *)var);


Можно что то похожее сделать в С#?
...
Рейтинг: 0 / 0
Генерный список.
    #40014748
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем делать каст на дженерик?
Код: c#
1.
void MyMethod<T>(List<T> list)

и дальше пользуйся методами листа как обычно
...
Рейтинг: 0 / 0
Генерный список.
    #40014753
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Зачем делать каст на дженерик?
Код: c#
1.
void MyMethod<T>(List<T> list)

и дальше пользуйся методами листа как обычно

я передаю лист в конструктор объекта (UserControl)
Код: c#
1.
2.
3.
public UserDataSet(List<?> list)
{
}


а так получаю ошибку
Код: c#
1.
2.
3.
public UserDataSet<T>(List<T> list)
{
}


The name 'T' does not exist in the current context.
...
Рейтинг: 0 / 0
Генерный список.
    #40014761
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class UserDataSet<T> : UserControl
{
  public UserDataSet(List<T> list)
  {
  }
  void MyMethod(List<T> list)
  {
  }
}
...
Рейтинг: 0 / 0
Генерный список.
    #40014764
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class UserDataSet<T> : UserControl
{
  public UserDataSet(List<T> list)
  {
  }
  void MyMethod(List<T> list)
  {
  }
}



спасибо.
...
Рейтинг: 0 / 0
Генерный список.
    #40014792
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сделал так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 List<T> generic_list = new List<T>();


private void ButtonLoad_Click(object sender, EventArgs e)
{
    switch (data_type)
    {
         case DATA_TYPE_PARAMS:
             List<Params> generic_list = LoadParametersFromFile(file_path);
             break;

          case DATA_TYPE_INOUT:
              List<InOut> generic_list = LoadInOutsFromFile(file_path);
              break;
     }
}

public List<Params> LoadParametersFromFile(string file)....

public List<InOut> LoadInOutsFromFile(string file)....



на строке List<InOut> generic_list = LoadInOutsFromFile(file_path); получаю ошибку

Error CS0128 A local variable or function named 'generic_list' is already defined in this scope

я не так делаю каст?
...
Рейтинг: 0 / 0
Генерный список.
    #40014799
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7

Error CS0128 A local variable or function named 'generic_list' is already defined in this scope

я не так делаю каст?

Разве в сообщении об ошибке есть что-то про каст? Оно говорит совсем о другом.
...
Рейтинг: 0 / 0
Генерный список.
    #40014801
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны
jenya7

Error CS0128 A local variable or function named 'generic_list' is already defined in this scope

я не так делаю каст?

Разве в сообщении об ошибке есть что-то про каст? Оно говорит совсем о другом.


так в чём проблема?
...
Рейтинг: 0 / 0
Генерный список.
    #40014803
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
так в чём проблема?
нужен перевод с английского или что?
Ты привел не тот код, на котором у тебя ошибка
...
Рейтинг: 0 / 0
Генерный список.
    #40014809
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
jenya7
так в чём проблема?
нужен перевод с английского или что?
Ты привел не тот код, на котором у тебя ошибка


почему не тот? List<T> generic_list = new List<T>(); объявлен глобально.
вот весь метод
Код: 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.
 private void ButtonLoad_Click(object sender, EventArgs e)
{
    string file_path;

    OpenFileDialog ofd = new OpenFileDialog
    {
         Filter = "XML Files (.xml)|*.xml"
    };
          
    DialogResult result = ofd.ShowDialog();

    if (result == DialogResult.OK)
    {
        file_path = ofd.FileName;

        switch (data_type)
        {
             case DATA_TYPE_PARAMS:
                 List<Params> generic_list  = LoadParametersFromFile(file_path);
                 break;

             case DATA_TYPE_INOUT:
                 List<InOut> generic_list = LoadInOutsFromFile(file_path);
                 break;
         }
    }
}
...
Рейтинг: 0 / 0
Генерный список.
    #40014817
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
сделал так

Код: c#
1.
2.
3.
4.
5.
6.
7.
         case DATA_TYPE_PARAMS:
             List<Params> generic_list = LoadParametersFromFile(file_path);
             break;

          case DATA_TYPE_INOUT:
              List<InOut> generic_list = LoadInOutsFromFile(file_path);
              break;



Error CS0128 A local variable or function named 'generic_list' is already defined in this scope

я не так делаю каст?


То, что внутри каждого кейса заверни в скобки {...}, если хочешь быстро исправить. Но, вообще, switch-case это Зло :))
...
Рейтинг: 0 / 0
Генерный список.
    #40014818
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Ты привел не тот код, на котором у тебя ошибка

На самом деле тот. См. выше мой коммент. switch-case не создаёт отдельный скоуп видимости переменных, если его явно не заставить это сделать через "{...}" поэтому у автора оба оюбъявления generic_list попадают в один скоуп (а именно метода), оттуда и ошибка.

Автору. Твой код уже просто синтаксически настолько неправилен, что я бы советовал начать с чтения каких-нибудь учебников по C#. Понимания generics, например, у тебя, очевидно, вообще нет.
...
Рейтинг: 0 / 0
Генерный список.
    #40014821
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
jenya7
сделал так

Код: c#
1.
2.
3.
4.
5.
6.
7.
         case DATA_TYPE_PARAMS:
             List<Params> generic_list = LoadParametersFromFile(file_path);
             break;

          case DATA_TYPE_INOUT:
              List<InOut> generic_list = LoadInOutsFromFile(file_path);
              break;



Error CS0128 A local variable or function named 'generic_list' is already defined in this scope

я не так делаю каст?


То, что внутри каждого кейса заверни в скобки {...}, если хочешь быстро исправить. Но, вообще, switch-case это Зло :))


спасибо. помогло. а почему зло? if - else if лучше?
...
Рейтинг: 0 / 0
Генерный список.
    #40014829
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
спасибо. помогло.

Ошибку оно исправило-то, да только теперь все будет работать не так, как ты ожидаешь. Твой локальный generic_list, который ты объявляешь внутри case просто исчезнет в никуда сразу после выхода из блока, а это явно не то, что ты хочешь.

jenya7
а почему зло? if - else if лучше?

Долго объяснять :))
Стратегия (шаблон проектирования)
...
Рейтинг: 0 / 0
Генерный список.
    #40014833
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
jenya7
спасибо. помогло.

Ошибку оно исправило-то, да только теперь все будет работать не так, как ты ожидаешь. Твой локальный generic_list, который ты объявляешь внутри case просто исчезнет в никуда сразу после выхода из блока, а это явно не то, что ты хочешь.

jenya7
а почему зло? if - else if лучше?

Долго объяснять :))

почему локальный? generic_list глобальный.
ааа...я понял. а как мне сделать каст на глобальный List<T> generic_list = new List<T>(); ?
типа generic_list (as List<Params>).....
...
Рейтинг: 0 / 0
Генерный список.
    #40014837
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
ааа...я понял. а как мне сделать каст на глобальный List<T> generic_list = new List<T>(); ?
типа generic_list (as List<Params>).....

Никак. Ты можешь приводить одно к другому только если это "одно" наследует от "другого", либо ковариантно ему. Поскольку при компиляции компилятор ничего не знает про тип T то он никак не сможет решить, возможно ли такое преобразование типа, или нет.

Я подозреваю, что у тебя сам дизайн этого куска приложения изначально кривой. Ты лучше расскажи, чего ты хочешь в итоге и мы, возможно, сможем подсказать, как правильно сделать.
...
Рейтинг: 0 / 0
Генерный список.
    #40014843
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
jenya7
ааа...я понял. а как мне сделать каст на глобальный List<T> generic_list = new List<T>(); ?
типа generic_list (as List<Params>).....

Никак. Ты можешь приводить одно к другому только если это "одно" наследует от "другого", либо ковариантно ему. Поскольку при компиляции компилятор ничего не знает про тип T то он никак не сможет решить, возможно ли такое преобразование типа, или нет.

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


Алгоритм такой
1. Открываю xml файл - и загружаю в структуру, например
файл
Код: c#
1.
2.
3.
4.
5.
6.
7.
<?xml version="1.0" encoding="utf-8"?>

<PARAMETERS>
    <PARAM ID="1"   Name="SCRSIZE"  Value="1024"   Description="Script size" />
    <PARAM ID="2"   Name="SCRCYC"   Value="100"    Description="Script run cycle (ms)" />
	<PARAM ID="3"   Name="CANENA"   Value="0"      Description="CAN bus enabled (0/1)" />
</PARAMETERS> 


код
Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
public class Params
    {
        public uint Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public int Value { get; set; }
        public string StrValue { get; set; }

    }

 List<Params> parameters = new List<Params>();

 public List<Params> LoadParametersFromFile(string file)
        {
            int msg_count = 0;
            uint uint_val;
            int int_val;
            string str;

            if (parameters != null)
                parameters.Clear();

            XmlDocument xmldoc = new XmlDocument();
            try
            {
                xmldoc.PreserveWhitespace = true;
                xmldoc.Load(file);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return null;
            }

            //import data from xml file to CanMessage list
            XmlNodeList nodes = xmldoc.DocumentElement.SelectNodes("/PARAMETERS/PARAM");
            foreach (XmlNode node in nodes)
            {
                try
                {
                    Params param = new Params();

                    uint_val = uint.Parse(node.Attributes["ID"].Value, NumberStyles.Integer); //NumberStyles.HexNumber
                    param.Id = uint_val;

                    str = node.Attributes["Name"].Value;
                    if (!string.IsNullOrEmpty(str))
                        param.Name = "";
                    else
                        param.Name = str;

                    if (int.TryParse(node.Attributes["Value"].Value, out int_val))
                    {
                        param.Value = int_val;
                        param.StrValue = int_val.ToString();
                    }
                    else
                    {
                        param.StrValue = "";
                    }

                    //can be empty
                    str = node.Attributes["Description"].Value.ToString();
                    if (!string.IsNullOrEmpty(str))
                        param.Description = str;

                    parameters.Add(param);
                }
                catch
                {
                    continue;
                }
            }

            return parameters;
        }


под каждый набор данных свой файл и свой список.
2. Загружаю список в DataGridView - пользователь проверяет, изменяет то что ему надо и посылает все ряды по серийному порту.

Я создал контрол на котором один DataGridView, кнопка LOAD, кнопка SEND. И я хочу динамически создавать DataGridView и загружать-посылать данные в зависимости от выбранного пользователем типа.
...
Рейтинг: 0 / 0
Генерный список.
    #40014846
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7

под каждый набор данных свой файл и свой список.
2. Загружаю список в DataGridView - пользователь проверяет, изменяет то что ему надо и посылает все ряды по серийному порту.

Я создал контрол на котором один DataGridView, кнопка LOAD, кнопка SEND. И я хочу динамически создавать DataGridView и загружать-посылать данные в зависимости от выбранного пользователем типа.

Я бы посоветовал тут вообще не связываться со списками и дженериками, а грузить файл в обычный нетипизированный DataSet и байндить грид на него. В формсах байндинг UI к кастомным объектам это боль еще та.
...
Рейтинг: 0 / 0
Генерный список.
    #40014856
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
почему не тот?
сорян, смотрел бегом, пропустил. Уже разобрались
...
Рейтинг: 0 / 0
Генерный список.
    #40014889
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
jenya7

под каждый набор данных свой файл и свой список.
2. Загружаю список в DataGridView - пользователь проверяет, изменяет то что ему надо и посылает все ряды по серийному порту.

Я создал контрол на котором один DataGridView, кнопка LOAD, кнопка SEND. И я хочу динамически создавать DataGridView и загружать-посылать данные в зависимости от выбранного пользователем типа.

Я бы посоветовал тут вообще не связываться со списками и дженериками, а грузить файл в обычный нетипизированный DataSet и байндить грид на него. В формсах байндинг UI к кастомным объектам это боль еще та.


но DataSet должен знать о полях каждого набора данных или как? не хотелось бы создавать 10 DataSet-ов если я создаю UserControl только под один.

я могу убрать парсирование файла в список и грузить прямо DataGridView но мне показалось что правильней работать через лэйер со списком.
...
Рейтинг: 0 / 0
Генерный список.
    #40014896
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
как мне сделать каст на глобальный List<T>
тебе не нужен каст, ты не в том направлении идешь.

Все, что касается конкретного типа, не должно быть реализовано в этом твоем обобщенном контроле. У тебя не должно быть приведений дженериков к конкретным типам. Если нужно реализовывать однотипные операции над разными типами, ты просто реализуешь в них какой-то общий интерфейс и твой дженерик контрол работает только через интерфейсы. Если есть что-то слишком специфическое для конкретного типа, это должено быть реализовано в отдельных классах, а не в твоем юзерконтроле.

Учить отделять работу с данными от работы с представлением.
...
Рейтинг: 0 / 0
Генерный список.
    #40014900
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
но DataSet должен знать о полях каждого набора данных или как?

Датасет это динамическая структура - список полей, их имена, типы и прочее задается уже во время выполнения приложения. Это как раз в случае классов тебе придется под каждую структуру файла свой класс писать. Минусы датасета, это то что он нетипизированный, не может иметь методов, и не имеет такой внятной семантики, как явно описанный класс. С другой стороны, он имеет кучу полезного функционала, который в случае класса реализовать как минимум нетривиально - оповещения об изменнениях, отслеживание измененных записей, фильтрацию данных и проч. Вопрос выбора это что из плюсов/минусов в конкретном случае перевешивает. В твоем сценарии я бы использовал именно датасет.
...
Рейтинг: 0 / 0
Генерный список.
    #40014901
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
jenya7
но DataSet должен знать о полях каждого набора данных или как?

Датасет это динамическая структура - список полей, их имена, типы и прочее задается уже во время выполнения приложения.


так как делать? так что ли?
1. xml файл в Table1
2. data_set.Tables.Add(Table1);
3. а как привязать DataSet к DataGridView ?
...
Рейтинг: 0 / 0
Генерный список.
    #40014902
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jenya7
fkthat
пропущено...

Датасет это динамическая структура - список полей, их имена, типы и прочее задается уже во время выполнения приложения.


так как делать? так что ли?
1. xml файл в Table1
2. data_set.Tables.Add(Table1);
3. а как привязать DataSet к DataGridView ?


мне кажеться меньше мороки сразу xml файл в DataGridView.
...
Рейтинг: 0 / 0
Генерный список.
    #40014905
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
fkthat
пропущено...

Датасет это динамическая структура - список полей, их имена, типы и прочее задается уже во время выполнения приложения.


так как делать? так что ли?
1. xml файл в Table1
2. data_set.Tables.Add(Table1);
3. а как привязать DataSet к DataGridView ?

Что-нибудь наподобие:
Код: c#
1.
2.
3.
DataSet dataSet = new();
dataSet.ReadXml(...);
dataGrid.DataSource = dataSet;


Как-то так. Я последний раз формс трогал почти 20 лет назад, так что прямо так готовый код сходу написать не могу, но идея такая.
...
Рейтинг: 0 / 0
Генерный список.
    #40014937
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Датасет это динамическая структура - список полей, их имена, типы и прочее задается уже во время выполнения приложения.

Только при десериализации из приведённого XML он заинферрит схему, в которой все значимые элементы (атрибуты) объявлены как xs:string, и это где-нибудь может выйти боком. Вот если в начало xml ещё всобачить схему, тогда да, колонки будут типизированными. Можно даже с констрейнтами (типа use="required").
...
Рейтинг: 0 / 0
Генерный список.
    #40014955
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>jenya7, сегодня, 14:08 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1330503&msg=22225682][22225682]
>Алгоритм такой...
<
В похожей ситуации (только не множество xml файлов, но база данных с множеством таблиц) поступил так:
для работы с конкретной таблицей свой конкретный, по необходимости динамически загружаемый и по ненужности динамически уничтожаемый, UserControl.
И атрибуты сущности записываю не list, а в observablecollection.
...
Рейтинг: 0 / 0
Генерный список.
    #40014963
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Только при десериализации из приведённого XML он заинферрит схему, в которой все значимые элементы (атрибуты) объявлены как xs:string, и это где-нибудь может выйти боком. Вот если в начало xml ещё всобачить схему, тогда да, колонки будут типизированными. Можно даже с констрейнтами (типа use="required").

Да можно хоть руками его прочитать. Я больше говорил о том, что если нужен байндинг, то DataSet часто может быть удобнее, чем POCO. А как и из чего этот DataSet наполнять это уже дело второе.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Генерный список.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]