none
Prüfen einer Hashtable mit LINQ RRS feed

  • Frage

  • Hallo,
    ich will mit LINQ feststellen, on in der Hashtable mindestens ein Eintrag existiert, dessen value true ist.

            private void Form1_Load(object sender, EventArgs e)
            {
                Hashtable ht = new Hashtable();
                ht.Add(1, false);
                ht.Add(2, false);
               
                bool result = ht.Values.Cast<DictionaryEntry>().Any(item => (bool)item.Value == true);

            }

    result soll true oder false sein

    Ich erhalte eine Fehlermeldung:   InvalidCastException was unhandled, Specified cast is not valid
    Fehlerquelle ist wohl (bool). Lasse ich das Casten weg, erhalte ich auch eine Fehlermeldung (object - bool).
    Wo liegt der Fehler?


    Alexander

    Donnerstag, 7. Juli 2011 14:05

Antworten

  • Warum castest du die values in ein DictioanryEntry, und nicht die Hashtable?

    //bool result = ht.Values.Cast<DictionaryEntry>().Any(item => (bool)item.Value == true);
    bool result = ht.Cast<DictionaryEntry>().Any(item => (bool)item.Value == true);
    

     

    • Als Antwort markiert AlexanderRi Donnerstag, 7. Juli 2011 14:32
    Donnerstag, 7. Juli 2011 14:26

Alle Antworten

  • Warum castest du die values in ein DictioanryEntry, und nicht die Hashtable?

    //bool result = ht.Values.Cast<DictionaryEntry>().Any(item => (bool)item.Value == true);
    bool result = ht.Cast<DictionaryEntry>().Any(item => (bool)item.Value == true);
    

     

    • Als Antwort markiert AlexanderRi Donnerstag, 7. Juli 2011 14:32
    Donnerstag, 7. Juli 2011 14:26
  • Hallo GreatVolk,

    das kommt vom Probieren und habe es dann übersehen.

    Danke.

     

    Alexander

    Donnerstag, 7. Juli 2011 14:34
  • Hallo AlexanderRi,

    zunächst mal die Frage, warum du eine Hashtable verwendest. Die Collections aus dem Namespace System.Collection gelten ja als veraltet wurden durch die Collections aus dem Namespace System.Collections.Generic abgelöst.

    Folgender Code liefert das gewünschte Ergebnis:

    Dictionary<int,bool> map = new Dictionary<int,bool>();
    
    map.Add(1, false);
    map.Add(2, true);
    
    bool result = map.Values.Any(t => t);
    
    Console.WriteLine(result);
    

     

    Solltest du aber, warum auch immer, weiterhin eine Hashtable verwenden, so funktioniert folgendes:

    Hashtable ht = new Hashtable();
    
    ht.Add(1, false);
    ht.Add(2, false);
    
    var result = ht.Values.Cast<object>().Any(t => (bool) t);
    Console.WriteLine(result.ToString());
    

    In der ht.Values Auflistung befinden sich object Objekte. Es sind ja nur die Werte. Die Schlüssel hast du ja ausgeschlossen. Daher geht der Cast in ein DictionaryEntry in die Hose.

    Ich hoffe ich konnte dir weiterhelfen. Solltest du noch Fragen haben...immer nur zu ;)

    Viele Grüße
    Holger M. Rößler

     


    Kaum macht man es richtig, schon funktioniert es
    Donnerstag, 7. Juli 2011 15:00