Tablice z różnymi typami

0

Witam,

Piszę trochę makr do AutoCAD używając AutoLISP, ale zaczynam powoli przesiadać się na C#. Natknąłem się na pewien problem. Otóż w AutoLISPie z łatwością mogę tworzyć listy jak poniżej:

(
("kabel1" 100 "YKY")
("kabel2" 300 "YAKY")
("kabel3" 200 "YKY")
("kabel4" 100 "YAKY")
)

Czyli w jednej liście podlisty z różnymi typami danych. W tym przypadku (string int string). Jak stworzyć podobną strukturę danych w C#?

Szukałem trochę i z tego co wyczytałem opcji mam kilka: ArrayList, Tuple(Boże jeden, co to jest?), stworzyć obiekty kabli i umieścić je w tablicy tych obiektów...

No i to jest właśnie moje pytanie do bardziej doświadczonych programistów: jaka metoda będzie najwygodniejsza? Jakieś sugestie?

1

Witam,

Najprościej:

    //klasa KABEL
    public class Kabel
    {
        public string Nazwa { get; set; }
        public int Dlugosc { get; set; }
        public string Oznaczenie { get; set; }
    }

Dalej gdzieś w innym miejscu kodu (3 sposoby dodawania "kabli" do kolekcji:

List<Kabel> listaKabli = new List<Kabel>();

            //sposób 1
            listaKabli.Add(new Kabel()
                {
                    Nazwa = "kabel1",
                    Dlugosc = 100,
                    Oznaczenie = "YKY",
                });

            //sposób 2
            Kabel k1 = new Kabel()
            {
                Nazwa = "kabel2",
                Dlugosc = 300,
                Oznaczenie = "YAKY",
            };
            listaKabli.Add(k1);

            //sposób 3
            Kabel k2 = new Kabel();
            k2.Nazwa = "kabel3";
            k2.Dlugosc = 200;
            k2.Oznaczenie = "YKY";
            listaKabli.Add(k2);

Zależnie od ilości "kabli" można użyć innego typu generycznego nisz lista ale to inna historia...

1

ArrayList przechowuje object - czyli tak właściwie... cokolwiek. Problem z ogólnym rozwiązaniem, jest taki że... jest ogólne.

private static void Main(string[] args)
{
    ArrayList list = new ArrayList(
        new object[]
            {
                new object[] {"kabel1", 100, "YKY"},
                new object[] {"kabel2", 300, "YAKY"}
            }
            );

    foreach (var row in list)
    {
        foreach (var column in (object[]) row)
            Console.Write("{0}\t", column);

        Console.WriteLine();
    }

    Console.ReadLine();
}

Radziłbym stworzyć prostą klasę typu:

    class Element
    {
        public string Name;
        public int Cost;
        public string Id;
    }
2

podstawowy problem z ArrayList to to, że pozwoli na coś takiego:

    ArrayList list = new ArrayList(
        new object[]
            {
                "ala ma kota",
                42,
                new object[] {"kabel1", 100, "YKY"},
                new object[] {"kabel2", 300}
            }
            );
2

Ja bym jeszcze dodał taki sposób definiowania listy:

var listaKabli = new List<Kabel> {
    new Kabel { Nazwa = "kabel1", Dlugosc = 100, Oznaczenie = "YKY" },
    new Kabel { Nazwa = "kabel2", Dlugosc = 300, Oznaczenie = "YAKY" },
    new Kabel { Nazwa = "kabel3", Dlugosc = 200, Oznaczenie = "YKY" },
    new Kabel { Nazwa = "kabel4", Dlugosc = 100, Oznaczenie = "YAKY" },
};

A jeśli do klasy Kabeldodamy konstruktor:

public Kabel(string nazwa, int dlugosc, string oznaczenie)
{
    this.Nazwa = nazwa;
    this.Dlugosc = dlugosc;
    this.Oznaczenie = oznaczenie;
}

To będziemy mogli zdefiniować listę tak:

var listaKabli = new List<Kabel> {
    new Kabel ("kabel1", 100, "YKY"),
    new Kabel ("kabel2", 300, "YAKY"),
    new Kabel ("kabel3", 200, "YKY"),
    new Kabel ("kabel4", 100 ,"YAKY"),
};
0

Dzięki śliczne, mili ludzie.

1

a jeżeli do listy dodamy metodę Add z odpowiednimi parametrami

class KabelList:List<Kabel>
{
    public void Add(string nazwa, int dlugosc, string oznaczenie)
    {
        Add(new Kabel(nazwa, dlugosc, oznaczenie));
    }
}

to będziemy mogli zdefiniować listę tak:

List<Kabel> listaKabli = new KabelList
{
    {"kabel1", 100, "YKY"},
    {"kabel2", 300, "YAKY"},
    {"kabel3", 200, "YKY"},
    {"kabel4", 100 ,"YAKY"}
};

:-)

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