Tablica z różnymi typami danych

Tablica z różnymi typami danych
DU
  • Rejestracja:prawie 12 lat
  • Ostatnio:około rok
  • Postów:55
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
kzkzg
I z czym konkretnie masz problem?
DU
  • Rejestracja:prawie 12 lat
  • Ostatnio:około rok
  • Postów:55
0

Ok. Zrobiłem tak:

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

Można lepiej?

SY
DU
  • Rejestracja:prawie 12 lat
  • Ostatnio:około rok
  • Postów:55
0

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

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 11 godzin
0

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

Kopiuj
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
DU
  • Rejestracja:prawie 12 lat
  • Ostatnio:około rok
  • Postów:55
0
Azarien napisał(a):

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

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

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

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

WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 9 godzin
  • Postów:5132
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#.

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

Kopiuj
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
SO
Jakaś zaleta tego czegoś nad standardowym params object[]?
somekind
Można zaimponować jakiemuś psycholowi na rozmowie kwalifikacyjnej.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:6 dni
  • Lokalizacja:Wrocław
0
duzers napisał(a):

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

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

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

DU
  • Rejestracja:prawie 12 lat
  • Ostatnio:około rok
  • Postów:55
0
somekind napisał(a):
duzers napisał(a):

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

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

Kopiuj
    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[] **
....

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

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

edytowany 1x, ostatnio: duzers
WeiXiao
A dlaczego chcesz się go pozbyć?
heyyou
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
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 11 godzin
2

Albo nawet tak:

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.