Listen

27/03/2008 - 12:14 von Brian Schmalisch | Report spam
Hallo,

ich habe eine Klasse erstellt und diese dann als Liste genommen. Die Werte
habe ich aus einer XML. Ich bekomme regelmàssig Vergleichswerte übergeben
und benötige dazu den zweiten Wert aus der Liste (hexcode).

Wie kann ich den erhaltenen Wert in meiner Liste finden (vergleichswert)?
Ich habe die Funktion Find() gefunden, komme aber nicht wirklich klar damit.

Hier mal meine Klasse:

class codes
{
private string vergleichswert = string.Empty;
private string hexcode = string.Empty;
public string Value
{
get { return vergleichswert; }
}
public string HexCode
{
get { return hexcode; }
}
public codes(string invalue, string outcode)
{
this.vergleichswert = invalue;
this.hexcode = outcode;
}
}

.

List<codes> codelist = new List<codes>();

XmlNodeList list = root.SelectNodes(@"//value");
if (list.Count > 0)
{
foreach (XmlNode node in list)
{
codelist.Add(new codes(node.Attributes["lircname"].Value.Trim(),
node.Attributes["hexcode"].Value.Trim()));
}
}

Brian
 

Lesen sie die antworten

#1 Elmar Boye
27/03/2008 - 18:37 | Warnen spam
Hallo Brian,

Brian Schmalisch schrieb:
ich habe eine Klasse erstellt und diese dann als Liste genommen. Die Werte
habe ich aus einer XML. Ich bekomme regelmàssig Vergleichswerte übergeben
und benötige dazu den zweiten Wert aus der Liste (hexcode).

Wie kann ich den erhaltenen Wert in meiner Liste finden (vergleichswert)?
Ich habe die Funktion Find() gefunden, komme aber nicht wirklich klar damit.

Hier mal meine Klasse:

class codes



Ein bissel viel Wildwest bei den Benamsungen ;-)

Varianten gibt zum finden gibt es mehrere.

Mittels Find ginge das zum Beispiel:
string vergleichswert = "123";
Codes toFind = list.Find(new Predicate<Codes>(delegate(Codes item)
{
return item.Value.Equals(vergleichswert);
}));

Will man das hàufiger benutzen, lohnt es den Code in eine eigene Klasse
zu verlagern, z. B.:
class CodesPredicates
{
private string vergleichswert;

public CodesPredicates(string vergleichswert)
{
this.vergleichswert = vergleichswert;
}

public bool FindVergleichswert(Codes item)
{
return item.Value.Equals(this.vergleichswert);
}
}

zu verwenden mit einem
Codes toFind = list.Find(new CodesPredicates("123").FindVergleichswert);

was Du àquivalent mit HexCode/outcode machen kannst.

Um die Klasse universeller zu nutzen wàre das einfachste
ein IEquatable<Codes> hinzuzufügen:

class codes : IEquatable<codes>
{
// ...

public bool Equals(Codes other)
{
if (other == null)
return false;
return other.vergleichswert.Equals(this.vergleichswert);
}
}

Dann kannst Du mit den IndexOf Methoden arbeiten:
Console.WriteLine("IndexOf: {0}", list.IndexOf(new Codes("123", "dummy")));

Der HexCode/outcode wird dabei nicht für den Vergleich berücksichtigt -
deswegen dafür einen eigenen Konstruktor hinzufügen, um auf das "dummy"
verzichten zu können.

Eine weitere Alternative wàre anstatt der List<> auf ein Dictionary<> oder
eine KeyedCollection zurückzugreifen.
Der Zugriff darauf ist bei vielen Elementen schneller, denn Find wie IndexOf
eine Liste durchlaufen eine Liste sequentiell, ein IDictionary<K, V> nutzt
den Hashcode des Schlüssels.

Gruß Elmar

Ähnliche fragen