Składnia List<keyValuePair...

0

Witam chciałbym się zapytać, czy istnieje możliwosć takiej inicjalizacjii a jeżeli tak to jaka i gdzie zarazem robie błąd w moim kodzie:

List<KeyValuePair<int, TestClass>> nowa2 = new List<KeyValuePair<int, TestClass>>(new KeyValuePair ( 1, new TestClass { TestClassId = 10, TestClassName = "Zet" }));

Chciałbym do listy wsadzić KeyValuePair, który zawiera int oraz dwa parametry Klasy TestClass (int oraz string), ale tak od razu po utworzeniu tej wielkiej struktury zainicjalizować pewne dane jak powyzej. Można w kilku linijkach rozbijać, tworzyc KeyValuePair później dodawać do listy, ale chciałbym się spytac czy istnieje możliwosć w jednej linijce spełnienia tych wszstkich czynności.

Pozdrawiam i z góry dziękuję :)

1

Robisz błąd, bo element listy przekazujesz jako parametr konstruktora, a nie ma takiego konstruktora, który by to akceptował. Powinno być tak (używam stringa, bo krócej):

List<KeyValuePair<int, string>> list = new List<KeyValuePair<int, string>> { new KeyValuePair<int, string>(1, "a") };

Nawiasy okrągłe konstruktora są w tym przypadku opcjonalne, natomiast elementy listy podaje się rozdzielane przecinkiem w nawiasach klamrowych.

0

Dziękuje za szybką odpowiedź, akurat u mnie jest <int, Classa>, zacząłem również googlować i udało mi się

a)

List<KeyValuePair<string, string>> pies = new List<KeyValuePair<string, string>>()
            {
                new KeyValuePair<string, string>("ja", "ja")
            };

b)

           List< KeyValuePair < int, TestClass >> wtf = new List<KeyValuePair<int, TestClass>>();
            {
                new KeyValuePair<int, TestClass>(1, new TestClass { TestClassId = 1, TestClassName = "ss" });
            };

Jednak mam nowe pytanie :) Dlaczego w przykladzie a) nie dozwolony jest średnik a w przykladzie b) jest wymagany

1

Drugi przykład robi całkiem co innego.

Najpierw tworzysz pustą listę. Później w nowym bloku kodu (za pomocą nawiasów {} możesz tworzyć sobie takie bloki) tworzysz nowe KeyValuePair, które nie jest nigdzie użyte. W rezultacie lista jest pusta.

0

Jak to jest pusta ;-;? Że ta druga jest pusta? Ale dodaje do niej wartości ! Key = 1, Values: TestClassId = 1, TestClassName = "ss"
Źle myślę? jak dodać zatem?

List< KeyValuePair < int, TestClass >> wtf = new List<KeyValuePair<int, TestClass>>();
            {
                new KeyValuePair<int, TestClass>(1, new TestClass { TestClassId = 1, TestClassName = "ss" });
            };

Gdy przeszedłem sobie foreachem rzeczywiście za bardzo się nie chce wypisywać.
Zatem jak poprawnie wkładać do tej listy?

0

No, źle myślisz. Przecież napisałem, że tworzysz pustą listę, a później w nowym bloku(który z listą nie ma nic wspólnego) tworzysz nigdzie nie używany obiekt o którym mówisz.

Poprawnie robi się tak jak w pierwszym przykładzie.

0

No tak, pierwszy przyklad działa. Ale c# nie pozwala do Listy w której zawarty jest KeyValuePair wstawić <int oraz KLASY?> nie można takich rzeczy tworzyc? ;-;

1

Czego nie pozwala wstawić?

var pies = new List<KeyValuePair<string, TestClass>>()
{
     new KeyValuePair<string, TestClass>("ja", new TestClass(jakies parametry))
}; 
0

Chciałbym mieć listę, która zawiera KeyValuePair, która zawiera jednego inta ID oraz obiekty klasy ( w tym wypadku TestClass), która posiada dwa elementy
int TestClassId oraz string TestClassName. Czy jest możliwe skonstruowanie takiego twora?

Lista
1 10 "Jacek"
2 20 "Pawel"
3 40 "Tomek"

1

Przecież ja i @some_ONE już napisaliśmy...

1

@wonman

A to twoje Id w KeyValuePair do czego ma służyć? I czy ma być z założenia unikalne?
Bo możesz zainteresować się Dictionary<int, TestClass>.

0

__Dziękuje za cierpliwość ! Chodziło o to że __

List< KeyValuePair < int, TestClass >> wtf = new List<KeyValuePair<int, TestClass>>() // **< ====== @@@@@@@@@@@@@@@@@@@@@@@@@ **

            {
                new KeyValuePair<int, TestClass>(1, new TestClass { TestClassId = 1, TestClassName = "a" }),
                new KeyValuePair<int, TestClass>(2, new TestClass { TestClassId = 10, TestClassName = "b" }),
                new KeyValuePair<int, TestClass>(3, new TestClass { TestClassId = 100, TestClassName = "c" }),
                new KeyValuePair<int, TestClass>(4, new TestClass { TestClassId = 1000, TestClassName = "d" })
            };
            var sin = from item in wtf where item.Value.TestClassId > 1 select item;
            foreach (var x in sin)
            {
                Console.WriteLine(x.Value.TestClassName);
            }

Wstawiłem tam średnik wcześniej " ...<int, TestClass>>() ; " a nie można tak. Teraz pięknie śmiga. Dziękuje z pomoc.
Dodawać do mojej listy można albo przy
a) inicjalizacji
b) słowko .Add()

Chciałem skorzystać z tego a) jednak średnik zakańczał inicjalizację zbyt wcześniej. Dziękuje serdecznie za pomoc, konsekwentnie co dzień uczę się c# a to była porządna lekcja.

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