Tablica z różnymi typami danych

Odpowiedz Nowy wątek
2018-11-02 18:32
0

Witam,
Tworzę plugin do jednego programu i w jednej z sekcji pluginu muszę zdefiniować poniższy schemat:
"NazwaFunkcji1", paramDodatkowyTypuInt1, IlośćParametrówUżytkownikaTypuInt, TablicaParamUżytkownika[]
"NazwaFunkcji2", paramDodatkowyTypuInt2, IlośćParametrówUżytkownikaTypuInt, TablicaParamUżytkownika[]
"NazwaFunkcji3", paramDodatkowyTypuInt3, IlośćParametrówUżytkownikaTypuInt, TablicaParamUżytkownika[]
Następnie w innej metodzie obrabiam te dane w jednej pętli podstawiając do odpowiednich zmiennych dane z powyższej tabeli.
Proszę o pomoc jak mogę ułatwić sobie życie. Jak zrobi taką tablicę?

edytowany 1x, ostatnio: duzers, 2018-11-02 18:45
I z czym konkretnie masz problem? - kzkzg 2018-11-02 18:43

Pozostało 580 znaków

2018-11-02 19:28
0

Ok. Zrobiłem tak:

    public class MojeDane
    {
        public string nazwaFunkcji;
        public int paramDodatkowy;
        public int iloscParametrowUsera;
        public int[] parametryUsera;
    }
            List<MojeDane> mojedane = new List<MojeDane>();
            mojedane.Add(new MojeDane { nazwaFunkcji = "MyFunction1", paramDodatkowy = 3, iloscParametrowUsera=2, parametryUsera =  new int[] { 3, 4 } });

Można lepiej?

dobrze jest - syryls 2018-11-02 19:40

Pozostało 580 znaków

2018-11-02 20:37
0

No dobrze. A czy istnieje możliwość definiowania wartości Listy bez potrzeby pisania nazw zmiennych?

Pozostało 580 znaków

2018-11-02 20:51
0

Jeśli elementy listy masz z góry znane to możesz zainicjalizować listę tak:

List<MojeDane> mojedane = new List<MojeDane>
{
    new MojeDane { nazwaFunkcji = "MyFunction1", paramDodatkowy = 3, iloscParametrowUsera=2, parametryUsera = new int[] { 3, 4 } },
    new MojeDane { nazwaFunkcji = "MyFunction2", paramDodatkowy = 3, iloscParametrowUsera=2, parametryUsera = new int[] { 3, 4 } }
};

Tylko ponazywaj to jakoś wszystko inaczej, nie iloscParametrowUsera, błagam.
Poza tym akurat ilość parametrów ci nie potrzebna jako osobna wartość, zawsze możesz pobrać rozmiar tablicy.

edytowany 3x, ostatnio: Azarien, 2018-11-02 20:52

Pozostało 580 znaków

2018-11-02 20:54
0
Azarien napisał(a):

Jeśli elementy listy masz z góry znane to możesz zainicjalizować listę tak:

List<MojeDane> mojedane = new List<MojeDane>
{
    new MojeDane { nazwaFunkcji = "MyFunction1", paramDodatkowy = 3, iloscParametrowUsera=2, parametryUsera = new int[] { 3, 4 } },
    new MojeDane { nazwaFunkcji = "MyFunction2", paramDodatkowy = 3, iloscParametrowUsera=2, parametryUsera = new int[] { 3, 4 } }
};

tylko ponazywaj to jakoś wszystko inaczej, nie iloscParametrowUsera, błagam.

Bardziej chodziło mi o skrócenie linii do czegoś w rodzaju:

new MojeDane{"MyFunction1",3,2,{3,4}}....

Chyba tu http://www.altcontroldelete.pl/artykuly/operacje-na-kolekcjach-w-c-/ mam odpowiedź.

Pozostało 580 znaków

2018-11-02 23:56
0

W sumie jest jedno rozwiązanie, ale jest ono wręcz unsafe (nie keyword) i możliwe, że unpredictable, bo trudno powiedzieć co będzie robić w następnej wersji C#.

public static void Main(string[] args)
{
    Foo(__arglist("test", 1, 2.5, 3, new int[]{1,2}));
}

static void Foo(__arglist)
{
    ArgIterator iter = new ArgIterator(__arglist);

    for (int n = iter.GetRemainingCount(); n > 0; n--)
    {
        var p = TypedReference.ToObject(iter.GetNextArg());

        Console.WriteLine(p.GetType());
    }
}

wynik:

System.String
System.Int32
System.Double
System.Int32
System.Int32[]

Lecz wrzucam to bardziej jako ciekawostkę niż realne rozwiązanie problemu, bo jest to coś, czego raczej nie chcesz w biznesie użyć.

edytowany 8x, ostatnio: WeiXiao, 2018-11-02 23:59
Jakaś zaleta tego czegoś nad standardowym params object[]? - some_ONE 2018-11-03 00:41
Można zaimponować jakiemuś psycholowi na rozmowie kwalifikacyjnej. - somekind 2018-11-03 02:19

Pozostało 580 znaków

2018-11-03 02:20
0
duzers napisał(a):

Bardziej chodziło mi o skrócenie linii do czegoś w rodzaju:

new MojeDane{"MyFunction1",3,2,{3,4}}....

To zdefiniuj sobie konstruktor, wtedy będziesz miał: lista.Add(new MojeDane("MyFunction1", 3, 2, { 3, 4 }));.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2018-11-03 08:51
0
somekind napisał(a):
duzers napisał(a):

Bardziej chodziło mi o skrócenie linii do czegoś w rodzaju:

new MojeDane{"MyFunction1",3,2,{3,4}}....

To zdefiniuj sobie konstruktor, wtedy będziesz miał: lista.Add(new MojeDane("MyFunction1", 3, 2, { 3, 4 }));.

Jest zrobione na wzór tego:

    public class Person
    {
        public int PersonId { get; private set; }
        public string FirstName { get; private set; }
        public string LastName { get; private set; }
        public int[] Tablica{ get; private set; }

        public Person(int nPersonId, string sFirstName, string sLastName, int[] nTablica)
        {
            PersonId = nPersonId;
            FirstName = sFirstName;
            LastName = sLastName;
            Tablica= nTablica;
        }
    }

Tylko nie wiem jak z definicji pozbyć się new int[]
....

new Person(111, "Jacek","Placek", new int[] { 11, 22 }),

....
Chcę się tego pozbyć dla maksymalnego uproszczenia :)

edytowany 1x, ostatnio: duzers, 2018-11-03 09:09
A dlaczego chcesz się go pozbyć? - WeiXiao 2018-11-03 09:05
jeśli ta tablica będzie ostatnim parameterem użyj params: public Person(int nPersonId, string sFirstName, string sLastName, params int[] nTablica) nie sprawdzałem, ale powinno śmigać :D - heyyou 2018-11-03 09:44
śmiga :) - duzers 2018-11-03 13:31

Pozostało 580 znaków

2018-11-03 22:49
2

Albo nawet tak:

        public class Person
        {
            public Person(int nPersonId, string sFirstName, string sLastName, params int[] nTablica)
            {
                ;
            }
        }

        public class PersonList : List<Person>
        {
            public void Add(int nPersonId, string sFirstName, string sLastName, params int[] nTablica)
            {
                Add(new Person(nPersonId, sFirstName, sLastName, nTablica));
            }
        }

        List<Person> mojedane = new PersonList
        {
            { 123, "Jan", "Kowalski", 1, 2, 3 },
            { 124, "Anna", "Nowak", 4, 5, 6, 7, 8 }
        };

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0