c# Waarde uit List tonen

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb recent een introductie training c# gehad en ben een beetje aan het rommelen.

Ik heb een struct gemaakt met 4 strings. Deze vul ik met 4 textboxen en sla ik op in een List.

Vervolgens toon ik 1 van die strings in een Listbox.

Nu wil ik als ik in die Listbox heen en weer ga tussen de waarden, graag de overige 3 strings ophalen en in de daarvoor bestemde textbox tonen. Alleen krijg ik die overige 3 strings er niet uit.

Ik ben begonnen met 1 string.

C#:
1
2
3
4
5
6
7
8
9
      private struct Interface
        {
            public String Name;
            public String InputDir;
            public String OutputDir;
            public String StoredProcedure;


        }

C#:
1
2
3
4
5
6
7
8
9
10
     private void btnAdd_Click(object sender, EventArgs e)
        {
            Interface i;
            i.Name = txtName.Text;
            i.InputDir = txtInputdir.Text;
            i.OutputDir = txtOutputdir.Text;
            i.StoredProcedure = cmbStoredProcedure.Text;
            Interfaces.Add(i);
            ShowInterfaces();
        }

C#:
1
2
3
4
5
6
7
8
        private void ShowInterfaces()
        {
            lstInterfaces.Items.Clear();
            foreach (Interface i in Interfaces)
            {
                lstInterfaces.Items.Add(i.Name);
         
            }


Vanaf hier gaat het niet goed.

C#:
1
2
3
4
5
6
7
8
9
10
11
        private void lstInterfaces_SelectedIndexChanged(object sender, EventArgs e)
        {
            
            var v = from i in Interfaces

                    where i.Name == lstInterfaces.Text
                    select i.InputDir.ToString();
            
            Console.WriteLine(v);
           
        }


Ik ben van alles aan het proberen, dus heb er even een Console.Writeline van gemaakt ipv dat ik het in een Textbox stop.

Ik denk dat ik er compleet naast zit, maar met googlen kom ik ook niet echt verder. Kan iemand mij in de goede richting wijzen?

Beste antwoord (via Verwijderd op 18-01-2019 14:24)


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je bent vanalles tegelijkertijd aan 't wijzigen... doe nou eens 1 ding per keer...

Ik zie je net posten:
C#:
1
2
3
4
var v = (from i in knkInterfaces
        where i.Name == lstInterfaces.Text
        select i.InputDir).First();
txtName.Text = v.Name;
Je select daar 't InputDir property en niet het hele object. Had je daar gewoon select i geschreven i.p.v. select i.InputDir dan had alles gewerkt as expected.

Nu post je weer
C#:
1
2
3
4
var v = (from i in knkInterfaces
        where i.Name == lstInterfaces.Text
        select i);
txtName.Text = v.First().Name;
Waar je de InputDir property uit de select hebt gehaald én de First() verhuist naar een andere regel. Het is een beetje lastig om antwoord te (blijven) geven als jij steeds subtiel een paar dingetjes verandert zonder daar melding van te maken.

Maak er nou eens gewoon:
C#:
1
2
3
4
var v = (from i in knkInterfaces
        where i.Name == lstInterfaces.Text
        select i).First();
txtName.Text = v.Name;
van. Je v variabele (nog z'on nutteloze naam overigens) is dan, zoals je verwachtte, een enkele "Interface".

Either way: je roept wel "Oh ja" maar ik heb nog stééds 't idee dat je 't niet helemaal snapt. Je bent er bijna, maar ik zou nog even niet naar 't volgende hoofdstuk gaan zeg maar ;)

[ Voor 51% gewijzigd door RobIII op 18-01-2019 11:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Alle reacties


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
  • struct Interface ... Ik weet niet hoor. Het kan maar een hele goeie naam vind ik 't niet ;) Interface is a) een gereserveerd woord en b) veel te generiek om je object goed te beschrijven
  • Niet dat 't per sé fout is, maar kun je me uitleggen waarom je een struct gekozen hebt ipv een class?
  • Je LINQ query returned (potentieel) meerdere elementen (ofwel: een IEnumerable<Interface>); je wil maar 1 element uit de list hebben (wat meteen impliceert dat de name uniek moet zijn wil 't goed werken) dus je zult een Single() of SingleOrDefault() (of First() of FirstOrDefault()) o.i.d. moeten doen.
Ik vraag me sowieso af of een List<T> hier een goede keuze is; ik zou eens kijken naar een Dictionary<T>. Die is a) een stuk efficiënter te bevragen (O(1)) en b) helpt je forceren dat een naam uniek is (als je de naam als key gebruikt uiteraard). Maar goed, als je dat nog niet gehad hebt in je cursus snap ik dat deze alinea misschien wat teveel van het goed is nog.

[ Voor 40% gewijzigd door RobIII op 18-01-2019 10:50 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op vrijdag 18 januari 2019 @ 10:38:
  • struct Interface ... Ik weet niet hoor. Het kan maar een hele goeie naam vind ik 't niet ;) Interface is a) een gereserveerd woord en b) veel te generiek om je object goed te beschrijven
  • Niet dat 't per sé fout is, maar kun je me uitleggen waarom je een struct gekozen hebt ipv een class?
  • Je LINQ query returned (potentieel) meerdere elementen (ofwel: een IEnumerable<Interface>); je wil maar 1 element uit de list hebben (wat meteen impliceert dat de name uniek moet zijn wil 't goed werken) dus je zult een Single() of FirstOrDefault() o.i.d. moeten doen.
Omdat ik vooral geoefend heb met structs. Classes zijn nog niet aan bod gekomen. Het hele OO deel ga ik nog voor een tweede cursus :)

In mijn test heb ik alleen unieke names gebruikt. De hele uitkomst van 's' verbaast mij. Het is namelijk:
code:
1
System.Linq.Enumerable+WhereSelectListIterator`2[KNK_AX_Interface.frmMain+Interface,System.String]


En ik zal de naam interfaces aanpassen. Thanks

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op vrijdag 18 januari 2019 @ 10:43:
[...]
In mijn test heb ik alleen unieke names gebruikt. De hele uitkomst van 's' verbaast mij. Het is namelijk:
Daar is niets verbazends aan; dat is namelijk precies wat ik je vertelde: je roept ToString() aan op een IEnumerable<T> i.p.v. op een enkel object. Je query geeft namelijk 0..N elementen terug; je wil natuurlijk maar 1 element hebben uit de list en dus zul je dat, zoals ik al zei, moeten aangeven. En dan heb je de ToString() ook niet (meer) nodig; dat is sowieso in 9 v.d. 10 gevallen een teken dat je ergens iets verkeerd doet. Je kunt dan gewoon Console.WriteLine(v.Name) gebruiken.

[ Voor 37% gewijzigd door RobIII op 18-01-2019 10:47 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op vrijdag 18 januari 2019 @ 10:44:
[...]

Daar is niets verbazends aan; dat is namelijk precies wat ik je vertelde: je roept ToString() aan op een IEnumerable<T> i.p.v. op een enkel object. Je query geeft namelijk 0..N elementen terug; je wil natuurlijk maar 1 element hebben uit de list en dus zul je dat, zoals ik al zei, moeten aangeven. En dan heb je de ToString() ook niet (meer) nodig; dat is sowieso in 9 v.d. 10 gevallen een teken dat je ergens iets verkeerd doet. Je kunt dan gewoon Console.WriteLine(v.Name) gebruiken.
Aaah! Ik snap het. Dankjewel. v.Name pakt hij niet maar

C#:
1
2
3
4
5
6
      var v = from i in knkInterfaces

                    where i.Name == lstInterfaces.Text
                    select i.InputDir;
            
            Console.WriteLine(v.First());


doet het. :)

Acties:
  • +2 Henk 'm!

  • JMaster
  • Registratie: December 2009
  • Laatst online: 13-07 17:06
Ja, hij returned nml een lijst van InputDir terug waarvan de corresponderende Name gelijk zijn aan lstInterfaces.Text.

var v = Interfaces.SingleOrDefault( x=> x.Name == lstInterfaces.Text) // selecteert het item "Struct" in jouw geval.


Vergeet het verhaal van mij.... er is teveel ge-edit door @RobIII in zijn post. Mijn toevoeging is niets meer waard ;) Een Dictionary en goede naamgeving maakt allees een stuk makkelijker.

[ Voor 30% gewijzigd door JMaster op 18-01-2019 11:00 ]


Acties:
  • +2 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nog niet helemaal ;)

v was, in je eerste post, een IEnumerable<Interface> (ofwel: 0..N elementen) en niet een enkel object "Interface" zoals je verwachtte. Waarom? Omdat de compiler niet op voorhand wéét dat je query maar 1 object gaat/mag returnen. Dus wordt v van het type IEnumerable<Interface>.

Als je de compiler vertelt dat je maar 1 element wil:
C#:
1
2
3
var v = (from i in knkInterfaces
    where i.Name == lstInterfaces.Text
    select i).First();

...dan wordt v van het type "Interface" (zie je nu waarom die naam ruk is? ;) ). En dan kun je dus wél v.Name schrijven ;)

In de code die jij geeft is v nog steeds een IEnumerable<...> en riep je in de Console.WriteLine de First() method aan die het eerste element, voor die Console.WriteLine, returned. Maar v is, en blijft, dus nog steeds een IEnumerable<...>. Als je het gevonden element verderop wil gebruiken moet je wéér First() aanroepen op v.

Los van dat alles: zorg dat je goed 't verschil leert/begrijpt tussen First(OrDefault) en Single(OrDefault).

[ Voor 43% gewijzigd door RobIII op 18-01-2019 11:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:53

Haan

dotnetter

En het is misschien ook handig om rekening te houden met wat er gebeurt als er toevallig geen Name gelijk is aan Text ;)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
JMaster schreef op vrijdag 18 januari 2019 @ 10:55:
Ja, hij returned nml een lijst van InputDir terug waarvan de corresponderende Name gelijk zijn aan lstInterfaces.Text.

var v = Interfaces.SingleOrDefault( x=> x.Name == lstInterfaces.Text) // selecteert het item "Struct" in jouw geval.


Vergeet het verhaal van mij.... er is teveel ge-edit door @RobIII in zijn post. Mijn toevoeging is niets meer waard ;) Een Dictionary en goede naamgeving maakt allees een stuk makkelijker.
Dit is eigenlijk veel handiger idd. Nu kan ik alles in 1x ophalen:

C#:
1
2
3
4
5
         var v = knkInterfaces.SingleOrDefault(x => x.Name == lstInterfaces.Text);
            txtName.Text = v.Name;
            txtInputdir.Text = v.InputDir;
            txtOutputdir.Text = v.OutputDir;
            cmbStoredProcedure.Text = v.StoredProcedure;


dankje :*)

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Haan schreef op vrijdag 18 januari 2019 @ 11:02:
En het is misschien ook handig om rekening te houden met wat er gebeurt als er toevallig geen Name gelijk is aan Text ;)
Het is sowieso handig om een method GetInterface(string name) te maken die gewoon de gewenste "Interface" teruggeeft (again: verwarring alom met zo'n naam) of null indien niets gevonden, of beter nog: gewoon een exception throwed indien niets gevonden. En als we dan toch bezig zijn; je wil waarschijnlijk case-insensitive zoeken :P

C#:
1
2
3
public Interface GetInterface(string name) {
  return knkInterfaces.SingleOrDefault(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase));
}

ofzo :P

Maar quite honestly: een Dictionary<string, Interface> scheelt je een enorme bak code en onnodige CPU cycles :+

[ Voor 21% gewijzigd door RobIII op 18-01-2019 11:14 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op vrijdag 18 januari 2019 @ 10:55:
[...]


Nog niet helemaal ;)

v was, in je eerste post, een IEnumerable<Interface> (ofwel: 0..N elementen) en niet een enkel object "Interface" zoals je verwachtte. Waarom? Omdat de compiler niet op voorhand wéét dat je query maar 1 object gaat/mag returnen. Dus wordt v van het type IEnumerable<Interface>.

Als je de compiler vertelt dat je maar 1 element wil:
C#:
1
2
3
var v = (from i in knkInterfaces
    where i.Name == lstInterfaces.Text
    select i.InputDir).First();

...dan wordt v van het type "Interface" (zie je nu waarom die naam ruk is? ;) ). En dan kun je dus wél v.Name schrijven ;)

In de code die jij geeft is v nog steeds een IEnumerable<...> en riep je in de Console.WriteLine de First() method aan die het eerste element, voor die Console.WriteLine, returned. Maar v is, en blijft, dus nog steeds een IEnumerable<...>. Als je het gevonden element verderop wil gebruiken moet je wéér First() aanroepen op v.

Los van dat alles: zorg dat je goed 't verschil leert/begrijpt tussen First(OrDefault) en Single(OrDefault).
Ik ga zo alles even lezen en begrijpen idd :) Ik heb nu werkende code.

Trouwens wat jij zegt:
C#:
1
2
3
4
5
           var v = (from i in knkInterfaces

                        where i.Name == lstInterfaces.Text
                        select i.InputDir).First();
            txtName.Text = v.Name;


Hij herkent nog steeds v.Name niet. Zie ik nou iets over het hoofd?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op vrijdag 18 januari 2019 @ 11:05:
Hij herkent nog steeds v.Name niet. Zie ik nou iets over het hoofd?
Wat is de foutmelding die je krijgt?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op vrijdag 18 januari 2019 @ 11:07:
[...]

Wat is de foutmelding die je krijgt?
'string' does not contain a definition for 'Name' and no extension method 'Name' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?)

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dan is knkInterfaces een IEnumerable<string> en geen IEnumerable<Interface> lieverd ;)

Ofwel: knkInterfaces is een bak strings i.p.v. een bak "Interfaces" (again: ruk naam)


Zie RobIII in "c# Waarde uit List tonen". Je hebt e.e.a. subtiel veranderd waardoor bovenstaand niet helemaal meer klopt (de strekking, min-of-meer, wel nog).

[ Voor 68% gewijzigd door RobIII op 18-01-2019 11:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op vrijdag 18 januari 2019 @ 11:10:
Dan is knkInterfaces een IEnumerable<string> en geen IEnumerable<Interface> lieverd ;)

Ofwel: knkInterfaces is een bak strings i.p.v. een bak "Interfaces" (again: ruk naam)
Ohja :+ ,

Zo doet hij het wel:

C#:
1
2
3
4
5
         var v = (from i in knkInterfaces

                        where i.Name == lstInterfaces.Text
                        select i);
            txtName.Text = v.First().Name;

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je bent vanalles tegelijkertijd aan 't wijzigen... doe nou eens 1 ding per keer...

Ik zie je net posten:
C#:
1
2
3
4
var v = (from i in knkInterfaces
        where i.Name == lstInterfaces.Text
        select i.InputDir).First();
txtName.Text = v.Name;
Je select daar 't InputDir property en niet het hele object. Had je daar gewoon select i geschreven i.p.v. select i.InputDir dan had alles gewerkt as expected.

Nu post je weer
C#:
1
2
3
4
var v = (from i in knkInterfaces
        where i.Name == lstInterfaces.Text
        select i);
txtName.Text = v.First().Name;
Waar je de InputDir property uit de select hebt gehaald én de First() verhuist naar een andere regel. Het is een beetje lastig om antwoord te (blijven) geven als jij steeds subtiel een paar dingetjes verandert zonder daar melding van te maken.

Maak er nou eens gewoon:
C#:
1
2
3
4
var v = (from i in knkInterfaces
        where i.Name == lstInterfaces.Text
        select i).First();
txtName.Text = v.Name;
van. Je v variabele (nog z'on nutteloze naam overigens) is dan, zoals je verwachtte, een enkele "Interface".

Either way: je roept wel "Oh ja" maar ik heb nog stééds 't idee dat je 't niet helemaal snapt. Je bent er bijna, maar ik zou nog even niet naar 't volgende hoofdstuk gaan zeg maar ;)

[ Voor 51% gewijzigd door RobIII op 18-01-2019 11:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Excuus :)
RobIII schreef op vrijdag 18 januari 2019 @ 11:27:
Either way: je roept wel "Oh ja" maar ik heb nog stééds 't idee dat je 't niet helemaal snapt. Je bent er bijna, maar ik zou nog even niet naar 't volgende hoofdstuk gaan zeg maar ;)
Klopt, ik heb het nu werkend. Nu nog even precies begrijpen wat er gebeurt. In ieder geval bedankt voor de moeite om me te helpen.

Ik heb nog genoeg uitdagingen in mijn applicatie'tje voordat ik verder ga met het volgende hoofdstuk, dus komt goed. :)

Ik wil nog "Interfaces" (ik begrijp nu idd dat het een lastige naam het is :+), kunnen aanpassen terwijl je er één geselecteerd hebt uit een listbox. En ze kunnen verwijderen uit de listbox en dus ook uit de List.

Daarna moeten de "interfaces" nog een directory pollen op bestandjes, uitlezen en vervolgens een stored procedure afknallen op een SQL database en de resultaten weer in een ander bestandje proppen.

Misschien heb ik het mezelf wat moeilijk gemaakt als eerste eigen c# programma, maar nu maak ik tenminste iets waar ik ook iets aan heb in de praktijk :)

[ Voor 15% gewijzigd door Verwijderd op 18-01-2019 11:43 ]


Acties:
  • +1 Henk 'm!

  • JMaster
  • Registratie: December 2009
  • Laatst online: 13-07 17:06
@Verwijderd
Oh, je hebt het jezelf veel te moeilijk gemaakt. Begin eerst eens classes te gebruiken, goede naamgeving en te werken met collections. Hierna collections proberen te 'binden' aan een gridview oid. Hier zijn de wereld aan examples van.

Probeer hierna items toe te voegen te verwijderen via de gridview en de lijst te updaten.

Als dit goed werkend is, ben je al heel veel verder.
Pagina: 1