Autor Beitrag
master147
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Sa 19.05.12 21:49 
Hallo,
ich habe eine Klasse in der sich 2 Listen (Beweg und Fest) befinden. Nun wollte ich eine Suchfunktion bauen, die die beiden Listen in der Klasse durchsucht.
Dabei bin ich auch List.FindAll gestoßen.

Leider ist in meiner Methode noch irgend ein Fehler drin.
Hier die Suchfunktion:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
 public static List<string> Suche(string Feiertag)
        {
            string s;
            List<string> Suche = new List<string>();
            return Suche.FindAll(s=>Beweg.Contains(Feiertag));
        }


Dabei bekomme ich die Meldung: Fehler:
Zitat:
Eine lokale Variable mit dem Namen "s" kann in diesem Bereich nicht deklariert werden, weil dadurch "s" eine andere Bedeutung erhalten würde, was bereits im Bereich "übergeordnet oder aktuell" in anderer Bedeutung verwendet wird.


Leider weiß ich nicht was daran falsch ist. Ich hoffe ihr könnt mir helfen.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 20.05.12 09:48 
Hallo,

entferne einfach die Variable string s. Bei Lambda-Ausdrücken (=>) erzeugt der Compiler aus der Methodendeklaration die passenden Datentypen für die angegebenen Variablennamen.
master147 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: So 20.05.12 11:03 
Hallo,

danke für den Tipp.

Aber irgend etwas ist immer noch falsch. Denn die Suchmethode greift nicht auf die Liste in der darüberliegenden Methode zu.
Es wird zwar die die Sucheingabe zur Klasse weitergeleitet und auch von der Suchmethode bearbeitet, allerdings greift diese dann nicht auf die Liste zu.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 20.05.12 11:22 
Du hast eine leere List "Suche" erstellt. Was erwartest Du, wenn Du darin suchst ;-)

Und was ist "Beweg" und was hat das in dem Lambda-Ausdruck zu suchen :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 20.05.12 11:24 
Hallo,

so wie der Code bisher ist, durchsuchst du ja auch eine leere Liste.

Du willst doch deine beiden Listen durchsuchen, also
ausblenden C#-Quelltext
1:
2:
3:
var list = Beweg.FindAll(s => s == Feiertag);

var list2 = Fest.FindAll(s => s == Feiertag);

Btw. statt FindAll dürfte auch Find ausreichen, denn die Feiertage wirst du ja wohl nicht doppelt in deinen Listen drin haben, oder?

Du solltest dir dann noch überlegen, was deine Methode Suche dann als Rückgabewert sinnvollerweise zurückgeben sollte (m.E. würde ein bool reichen).
master147 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: So 20.05.12 12:33 
Danke für die Hinweise,

aber ich glaube die Suchfunktion durchsucht immer noch eine leere Liste.
Kann das daran liegen, dass die Listen in zwei unterschiedlichen Methoden in der Klasse sind ?
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Fr 01.06.12 14:06 
Hallo,
also daran dass du es in unterschiedlichen Methoden aufrufst kann es nicht liegen, es sei denn du deklarierst die Liste in einer anderen Methode, aber dann würde der Compiler sich beschweren.
Aber noch was anderes: Was willst du genaz bezwecken? Willst du überprüfen, ob es den angegebenen Feiertag gibt oder willst du wissen wann der nächste ist oder welches Datum der angegebene Feiertag hat?
Das ganze sollte ungefähr so aussehen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
public class DeineKlasse
    {
        Dictionary<string, DateTime> Feiertage = new Dictionary<string, DateTime>();
 
        private DeineKlasse()
        {
            Feiertage.Add("Weihnachten"new DateTime(20121224));
            //usw. Für die Ganzen Feiertage
        }

        public bool FeiertagExistier(string name)
        {
            return Feiertage.ContainsKey(name); //Prüft ob ein Feiertag mit dem Namen vorhanden ist.
        }

        public string NächsterFeiertag(DateTime datum, out DateTime feiertagDatum)
        {
            KeyValuePair<string, DateTime> naechster = new KeyValuePair<string, DateTime>();

            foreach (KeyValuePair<string, DateTime> feiertag in Feiertage)  //Überprüfen welches Datum das Nächste ist.
            {
                TimeSpan aktuell = feiertag.Value.Subtract(datum); 
                if (String.IsNullOrEmpty(naechster.Key) || aktuell < naechster.Value.Subtract(datum)) naechster = feiertag;
            }

            feiertagDatum = naechster.Value;    //Setzt die out Variable, so kannst du noch das Datum des Feiertags ausgeben
            return naechster.Key;   //Gibt den Namen des Feiertags aus.
        }

    }

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Fr 01.06.12 16:04 
Poste doch mal den Code deiner Klasse.

Dann wird vielleicht auch klar, was genau du damit bezwecken willst oder dass du die Sache eventuell ganz falsch anfängst.