Tablica z różnymi typami danych

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ę?

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?

0

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

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.

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ź.

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ć.

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 }));.

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 :)

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 }
        };

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