Forum: PC-Programmierung Mehrere Werte zurückgeben (C#)


von Leon E. (adiagi)


Lesenswert?

Hi Leute

hab den folgenden Code:
1
public static Connector GetConnectorForEvent()
2
{
3
            
4
     foreach (KeyValuePair<string, SerialPortConnector> pair in getComPort)
5
     {
6
          return pair.Value;
7
8
     }
9
            
10
     return null;
11
}

Wenn ich diese Funktion aufrufe benötige ich alle Values des Dictionary.
Jedoch wird nach dem ersten return die Funkiion verlassen, es wird also 
nur ein wert zurückgegeben.
Wie kann ich anstellen, dass ich jeden Wert zurückgebe
Die Funktion, die GetConnectorForEvent aufruft sollte so aussehen.
1
private void btnAddEvent_Click(object sender, EventArgs e)
2
{
3
     _connector = ConnectorFactory.GetConnectorForEvent();
4
            
5
}

wie gesagt wird meinem Click-Event nur ein wert übergeben, ich benötige 
jedoch alle Werte.

Vielen Dank

Gruß

Agit

von Peter II (Gast)


Lesenswert?

du musst eine liste zurückgeben, also

List<Connector>

von Leon E. (adiagi)


Lesenswert?

Peter II schrieb:
> du musst eine liste zurückgeben, also
>
> List<Connector>

Kannst du ein wenig nähere Angaben machen?

Gruß agit

von Peter II (Gast)


Lesenswert?

public static List<Connector> GetConnectorForEvent()
{
     List<Connector> r = new List<Connector>();
     foreach (KeyValuePair<string, SerialPortConnector> pair in 
getComPort)
     {
          r.Add(pair.Value);
     }

     return r;
}

von Karl H. (kbuchegg)


Lesenswert?

Du kannst nur EINEN Wert zurückgeben.

Aber: Du kannst dir ja einen Container bauen, der die Ergebnisse 
aufnimmt. Dann ist der Container dieser eine Wert, der zurückgegeben 
wird. Und im Container stecken die eigentlichen Werte, die dich 
interessieren.

Hier wurde dann eben der Vorschlag gemacht eine List als Container zu 
benutzen.

Deine Funktion returned in der foreach überhaupt nicht, sondern steckt 
die Werte, die sie zurückgeben will in einen Container, eben die Liste.
Und am Ende der Funktion wird dann der Container zurückgegeben.

Der AUfruf kriegt das List-Objekt und iteriert wiederrum darüber und 
macht dann eben irgendwas mit jedem Wert in diesem Container.


Ist wie bei der Post.
Mit einer einzigen Sendung kannst du einen Brief verschicken oder einen 
Barscheck. Wenn du aber beides auf einmal verschicken willst, dann 
steckst du eben beides in ein Kuvert und verschickst das Kuvert. Aus 
Sicht der Post ist das ein einzige Sendung, die frankiert wird. Was und 
wieviele Dinge du im Kuvert hast, interessiert die Post nicht. Die 
interessiert sich nur für den Transport des Kuverts.

von Leon E. (adiagi)


Lesenswert?

hi,
danke für die antworten.

Sry Peter wenn ich nochmal frage, aber wie rufe ich die Funktion dann 
auf?

hatte es bisher so:
1
private void btnAddEvent_Click(object sender, EventArgs e)
2
{
3
     _connector = ConnectorFactory.GetConnectorForEvent();
4
            
5
}

gruß agit

von Peter II (Gast)


Lesenswert?

Agit A. schrieb:
> Sry Peter wenn ich nochmal frage, aber wie rufe ich die Funktion dann
> auf?

keine ahnung wir wissen überhaupt nicht was du erreichen willst.

> _connector = ConnectorFactory.GetConnectorForEvent();

ich weiss weder was mit _connector gemacht wird, noch weiss ich was es 
am ende werden soll.


Das ganze sieht aber irgendwie merkwürdig aus. Beschreibe erstmal was du 
machen willst und nicht wie du es machen willst.

von Leon E. (adiagi)


Lesenswert?

hi,

ok versuche es zu beschreiben.

Also ich habe eine Klasse ConfigurationFactory, die ein Dictionary hat.
Dieses dictionary enthält die Comports, die ich zuvor zuweise.
Nun habe ich eine Klasse TransmitControl, die für jeden Eintrag im 
Dictionary einen Event anmelden soll.
Über den _connector greif ich auf die ConnectorFactory zu.
nun will ich halt, dass jeder Connector einmal angemeldet wird.


hatte es bisher so
1
private void btnAddEvent_Click(object sender, EventArgs e)
2
{
3
           
4
           
5
    _connector = ConnectorFactory.GetConnectorForEvent();
6
    if (_connector != null)
7
    {
8
        _connector.MostMessageReceived += new EventHandler<MostMessageEventArgs>(Connector_MostMessageReceived);
9
        _connector.MostMessageSent += new EventHandler<MostMessageEventArgs>(Connector_MostMessageSent);
10
         btnAddEvent.Enabled = false;
11
     }            
12
         
13
}

in diesem Fall wird aber immer nur ein Connector angemeldet.

Falls du noch fragen hast, dann bitte

gruß

agit

von Karl H. (kbuchegg)


Lesenswert?

Die Klasse, in der dieser Button Handler sitzt, kann dann natürlich 
nicht einfach nur einen einzelnen Connector halten, sondern muss dann 
ebenfalls eine Liste davon halten.

Und über die iterierst du dann nach dem Funktionsaufruf mit einem 
for_each, holst dir einen Connector nach dem anderen und erzeugst die 
entsprechenden Handler.

Wo ist da jetzt das Problem?

Hinweis: Nenn auch die Funktion um.
GetConnectorForEvent impliziert, dass die Funktion nur 1 Conenctor 
liefert. Die liefert aber mehrere, verpackt in einer Liste. Also wäre 
ein angemessener Name dafür zb GetListOfConnectorsForEvent()

Damit ist dann auch klar, dass in
1
private void btnAddEvent_Click(object sender, EventArgs e)
2
{
3
           
4
           
5
    _connector = ConnectorFactory.GetListOfConnectorsForEvent();
_connector ein derartiges Listenobjekt sein muss. Und da es sich da 
daher wiederrum um mehrere Connectoren handeln kann, sollte die Variable 
dann auch _connectors (also Plural) heissen.

Es sind so Kleinigkeiten in einem durchgehenden Benamungsschema, welche 
einem das Leben als Programmier unendlich leichter machen können. Denn 
wie gehts jetzt weiter?
1
private void btnAddEvent_Click(object sender, EventArgs e)
2
{
3
           
4
           
5
    _connectors = ConnectorFactory.GetListOfConnectorsForEvent();

An dieser Stelle sind es also mehere Connectors. Steht ja da. 
_connectotrs ist Plural - also mehrere. Mit mehreren kann man nichts 
machen. Aber mit 1! Also muss man daher an einen Connector nach dem 
nächsten rann
1
private void btnAddEvent_Click(object sender, EventArgs e)
2
{
3
           
4
           
5
    _connectors = ConnectorFactory.GetListOfConnectorsForEvent();
6
7
    foreach (Connector conn in connectors_)
8
    {
9
      conn.MostMessageReceived += new EventHandler<MostMessageEventArgs>(Connector_MostMessageReceived);
10
      conn.MostMessageSent += new EventHandler<MostMessageEventArgs>(Connector_MostMessageSent);
11
    }
12
13
    btnAddEvent.Enabled = false;
14
}

Es folgt alles ganz logisch. Und wenn du dir die Einzelanweisungen 
ansiehst, dann sind das schon fast komplette Sätze. Ein paar Füllwörter 
noch dazudenken und da steht schon fast im Klartext, was zu passieren 
hat.

Sauber durchgezogene Namesnschemata, die auch Sinn machen und und bei 
dem die Wörter genau das beschreiben, wofür sie stehen, sind .... ooop, 
das sagte ich schon.

von Leon E. (adiagi)


Lesenswert?

hi,

ich rufe die Funktion so auf:
1
private void btnAddEvent_Click(object sender, EventArgs e)
2
{
3
4
       List<Connector> r =ConnectorFactory.GetConnectorForEvent();
5
       int i;
6
       for (i = 0; i < r.Count; i++)
7
       {
8
            r[i].MostMessageReceived += new EventHandler<MostMessageEventArgs>(Connector_MostMessageReceived);
9
            r[i].MostMessageSent += new EventHandler<MostMessageEventArgs>(Connector_MostMessageSent);
10
11
        }
12
        btnAddEvent.Enabled = false;
13
                       
14
         
15
}

So Funktioniert ies
danke nochmal

von Peter II (Gast)


Lesenswert?

und warum kein foreach?
1
private void btnAddEvent_Click(object sender, EventArgs e)
2
{
3
4
       foreach(Connector con in ConnectorFactory.GetConnectorForEvent() )
5
       {
6
            con.MostMessageReceived += new EventHandler<MostMessageEventArgs>(Connector_MostMessageReceived);
7
            con.MostMessageSent += new EventHandler<MostMessageEventArgs>(Connector_MostMessageSent);
8
9
        }
10
        btnAddEvent.Enabled = false;
11
}

von Leon E. (adiagi)


Lesenswert?

Peter II schrieb:
> und warum kein foreach?

Weil ich schwieriger machen muss als es ist :)

Danke für den Tip!

Gruß

Agit

von Sven H. (dsb_sven)


Lesenswert?

Wie wäre es, wenn du dir erst einmal die Grundlagen der, von dir 
gewählten, Programmiersprache aneignen würdest?

Bücher helfen da weiter. Alternativ gibt es auch das Openbook zu c#, das 
ist auch sehr gut.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.