Laden...

[gelöst] List<T> FindIndex() bei T = selbstdefinierter Datentyp

Erstellt von The_Mexican vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.470 Views
The_Mexican Themenstarter:in
87 Beiträge seit 2009
vor 14 Jahren
[gelöst] List<T> FindIndex() bei T = selbstdefinierter Datentyp

Hey,

mein problem ist es, wie ich den index eines listenelements finden kann. soweit ganz einfach, mein problem ist, dass ich ne liste mit einem selbst definierten datentyp habe:


struct Datatype
{
   string id,
   string name,
   ...
}

List<Datatype> blub = new List<Datatype>();

...
// Der liste werden Elemente hinzugefügt
...

// Suche Index
public int GetIndexOfElement(string incomingID)
{
   int tmpReturn;
   tmpReturn = blub.FindIndex( /* Predicate */);
   return tmpReturn;
}

// Sinngemäß die Suche im Predicate:
private bool Predicate(datatype blub, string incomingSession)
{
  return String.Equals(blub.id[an der aktuellen stelle], incomingSession);
}

incomingID dabei als Klassenvariable verwenden entfällt!!

Ich steh einfach gerade aufm schlauch wie ich das Predicte realisiere bzw. die Methode deklarieren soll.

für hilfe wäre natürlich dankbar 😉

greets
mex

que? como? no entiendo!!!!!

998 Beiträge seit 2007
vor 14 Jahren

Hallo,


class Program
    {
        private static List<int> _liste;

        static void Main(string[] args)
        {
            _liste = new List<int>{1,3,6,8,3,5,2,4,3,7,9,8};
            Console.WriteLine(GetIndexOfIrgendwas(3));
            Console.ReadKey();
        }

        static int GetIndexOfIrgendwas(int deinWert)
        {
            return _liste.FindIndex(val => val > deinWert); 
        }
    }

Wenn ich dich richtig verstehe, sollte das machen was du willst (zumindest das Prinzip).

Gruß David

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo The_Mexican,

du kannst für /* Predicate */ einsetzen (ungetestet, aber mindestens im Prinzip richtig):

delegate (Datatype dt) { return dt.id == incomingID; }

herbivore

The_Mexican Themenstarter:in
87 Beiträge seit 2009
vor 14 Jahren

@ Herbivore
k, ich versuchs danke für den hinweis

@ David,

danke für die antwort leider haben wir uns missverstanden 😦

meine Liste enthält elemente eines selbst definierten datentyps (string id, string name, ...)

string id ist dabei eindeutig (DBverwaltung entfällt übrigens)

in der aufrufenden methode GetIndexOfElement(string incomingID) geht es darum, den Index eines Listenelements zu ermitteln FindIndex(Prdicate)

In der "Predicate-Methode" wird nun aktuellesListenelement.id mit der incomingID verglichen (String.Equals(Listenelement.id, incomingID) und liefert true/ false zurück.

bei true wird in GetIndexOfElement tmpIndex mit dem Index des Elements in der Liste versehen.

hoffe ich habs jetzt besser hinbekommen mein problem zu schildern?!

greets
alex

que? como? no entiendo!!!!!

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo The_Mexican,

so hatte ich das schon verstanden und meine Antwort bezieht sich darauf.

Allerdings wäre es, wenn du über die Id schnell auf die Elemente zu greifen willst, eine Überlegung wert, vielleicht besser ein Dictionary <String, Datatype> zu werden, wobei der Key die Id wäre.

herbivore

The_Mexican Themenstarter:in
87 Beiträge seit 2009
vor 14 Jahren

hey herbivore,

kleine frage zum verständnis

delegate (Datatype dt) { return dt.id == incomingID; }  

die delegate dt würde ein abbild der aktuell gefüllten liste enthalten, richtig???

ich blicks noch nicht ganz mit delegaten deswegen frag ich vmtl etwas doof...

greets
mex

que? como? no entiendo!!!!!

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo The_Mexican,

nein, bei dem delegate ... handelt es sich um eine anonyme Methode, die von FindexIndex für jedes Listenelement aufgerufen wird, bis die anonyme Methode erstmalig true zurückgibt oder das Ende der Liste erreicht ist.

herbivore

Gelöschter Account
vor 14 Jahren

ab .net 3.x kannst du auch statt dem '/* Predicate */' auch:

myDatatype => myDatatype.ID == incomingID

ersetzen.

998 Beiträge seit 2007
vor 14 Jahren

Hallo The_Mexican,

aber genau das kannst du doch mit meiner Lösung so machen 😃 Verstehe das Problem nicht so ganz.


class Program
    {
        private static List<Datatype> _liste;

        struct Datatype
        {
            public int id;
            public string name;
        }

        static void Main(string[] args)
        {
            _liste = new List<Datatype>()
                         {
                             new Datatype{id=1,name="David"}, 
                             new Datatype{id=2, name = "Julia"}
                         };
            int index = GetIndexOfId(1);

            Console.WriteLine("Person mit id {0} befindet sich an index {1}",1,index);

            Console.ReadKey();
        }

        static int GetIndexOfId(int id)
        {
            return _liste.FindIndex(val => val.id == id);
        }
    }

Gruß David

5.941 Beiträge seit 2005
vor 14 Jahren

Hallo The_Mexican

Siehe auch [Artikel] Delegaten, anonyme Methoden, Lambda-Ausdrücke & Co.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

The_Mexican Themenstarter:in
87 Beiträge seit 2009
vor 14 Jahren

hallo david,

jetzt versteh ich dein bsp. wenn ichs richtig verstanden habe s.h. post von JAck30lena dann ist das nur mit .net 3.x möglich ich arbeite mit .net 2.0

greets
mex

que? como? no entiendo!!!!!

998 Beiträge seit 2007
vor 14 Jahren

Hallo,

dann musst du das Beispiel ein wenig nach Herbivores Vorschlag umbauen 😉


static int GetIndexOfId(int id)
{
     return _liste.FindIndex(delegate(Datatype dt) { return dt.id == id; });
}

Gruß David

The_Mexican Themenstarter:in
87 Beiträge seit 2009
vor 14 Jahren

Affengeil!!

Funktioniert!

danke an alle - hab das mit den deleagten zwar noch nicht komplett verinnerlicht aber das werd ich jetzt tun.

wie gesagt, danke für die hilfe...

greets
mex

que? como? no entiendo!!!!!

Z
457 Beiträge seit 2007
vor 14 Jahren

Nein Lambdas gehen auch mit .NET 2.0 solange du C# 3.0 verwendest.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Zebes,

Nein Lambdas gehen auch mit .NET 2.0 solange du C# 3.0 verwendest.

tut The_Mexican aber wohl nicht:

Entwicklungsumgebung: vs2005

herbivore

Z
457 Beiträge seit 2007
vor 14 Jahren

Ok. wollte nur klarstellen, dass es nicht von der .NET Version, sondern von der C# Version abhängig ist. Zumidnest ab .NET2.0

mfg
Zebes