Entwickler-Ecke

C# - Die Sprache - List<int> kann nicht auf Operanden vom Typ System.Collection


mmgg - Di 08.07.14 03:19
Titel: List<int> kann nicht auf Operanden vom Typ System.Collection
Wie kann man prüfen ob Value > 0 ist, wenn nicht mit if (value > 0)?
Errormessage lautet : "Der Operator ">" kann nicht auf Operanden vom Typ System.Collection.Generic.List<int> und int angewendet werden".
Ich seh nicht dass das passiert, value ist ja nicht die Liste, value ist der Wert den ich letztlich zuweise.
Wenn das nicht get, hab ich keinen Plan wie denn dann?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
private List<int> mListe;
public List<int> MyIntListe
        {
            get
            {
                return mListe;
            }
            set{
                if (value != null)
                {
                    mListe= value;
                }
                else
                {
                    throw new Exception("You must make at least one selection\n in the 'Dividend' option box");
                }
            }
        }


Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Christian S. - Di 08.07.14 07:29

Hallo,

value ist immer der Wert, der der Property zugewiesen wird (hier: MyIntListe) und hat daher auch denselben Typ (hier: List<int>). Wovon bist Du ausgegangen, was value in Deinem Code ist?

Grüße
Christian


Ralf Jansen - Di 08.07.14 09:50

Zitat:
Ich seh nicht dass das passiert, value ist ja nicht die Liste, value ist der Wert den ich letztlich zuweise.


Doch value ist die Liste. Wenn du der List etwas hinzufügst wird nur der Getter der Property benutzt (um an die Liste zu kommen) und dann die ganz normale Add Methode von List. Wenn du einen Wert prüfen willst der der Liste hinzugefügt wird brauchst du also eine Ableitung von List mit entsprechender Prüfung. Da List ein eher abgeschlossenen Ding ist würde ich von Collection<T> ableiten und dort InsertItem überladen.


mmgg - Di 08.07.14 22:49

@Christian

so wende ich es an


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
class Program
    {
        static void Main(string[] args)
        {
            Class1 c = new Class1();
            c.MyIntListe.Add(1);
            c.MyIntListe.Add(2);

            foreach (int tmpElm in c.MyIntListe)
                Console.WriteLine(tmpElm);    

        }
    }

deswegen war ich sicher value ist eben der value. Auch weil ich value an mListe zuweise und mListe ist ja nun auch Liste

@Ralf
im geter passiert das, dann nützt mir das hier natürlich auch nichts.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 if (value != null)
                {
                    if (value[0] < 0// kurz gefasst man müsste sich jetzt noch um den index kümmern.
                    mListe = value;
                }
                else
                {
                    throw new Exception("You must make at least one selection\n in the 'Dividend' option box");
                }


spricht was dagegen es so zu machen(hab jetzt nur den getter hier reingesetzt)

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
 
public List<int> MyIntListe
        {
            get
            {
                if (mListe.Count > 0)
                {
                    if (mListe[0] < 0)
                        mListe.RemoveAt(0);
                }
                return mListe;
            }


Ableiten bedeutet ja, ich müsste Class1 von List erben lassen, was nur solang möglich ist, wie class 1 noch nicht von was anderem ableiten soll?

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Ralf Jansen - Mi 09.07.14 10:09

class1 ist da unbeteiligt.
Hier
Zitat:

C#-Quelltext
1:
c.MyIntListe.Add(1);                    

wird die Add Methoden von List<int> aufgerufen und nie irgendwelcher Code von class1 (mal abgesehen vom getter um an die Liste zu kommen).
Wenn wir das mal so schreiben

C#-Quelltext
1:
2:
List<int> tmp = c.MyIntListe;
tmp.Add(1);


wird es vielleicht klarer. Es passiert absolut das gleiche. Aber man erkennt das der Aufruf von Add nur die List<int> betrifft nicht class1. Wenn du also irgendeine Prüfung brauchst dann muß sie in der Add Methode von List<int> passieren. Da das nicht geht brauchst du eine andere Listen Klasse die du in class1 als MyIntListe veröffentlichen kannst deren Add Methode aber überschreibbar ist. Das wäre zum Beispiel die erwähnte Collection<T> Klasse die zum Ableiten für solche Fälle vorbereitet ist.


Palladin007 - Mi 09.07.14 10:36

In manchen Fällen ist es vielleicht ganz sinnvoll, ICollection<T> zu implementieren, dann hat die Klasse selber die Add-Methode und es ist folgendes Feature möglich:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
class TolleIntCollection : ICollection<int>
{
    // ...
}

// ---------------

var obj = new TolleIntCollection()
{
    1,
    2,
    3
};


Und wer keine Lust hat, ICollection<T> selber zu implementieren (kann im Hintergrund ja eine simple Liste sein, an die die AUfrufe weiter gereicht werden), der kann dann von der Klasse Collection<T> erben.
Wenn von Collection<T> nicht geerbt werden kann (warum auch immer), dann muss wohl doch das reine Interface genommen werden.


mmgg - Mi 09.07.14 23:00

Ich wollte mir jetzt so behelfen, dass ich eine Liste als Property ganz sein lasse, scheint einfach zuviel Balast mitzuziehen, stattdessen einfach zwei Methoden.
In der GetMyListInt Methode wird mListe nicht zugelassen: "Der Name 'mListe' existiert nicht im aktuellen Context'"
Warum das nicht? mListe ist doch letztlich eine Variable, ist im Kopf deklariet und muss doch greifbar sein an der Stelle?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
class Class1
    {
 private List<int> mListe;
        public Class1()
        {
            mListe = new List<int>();
        }

  public void SetMyListInt(int i)
        {
            mListe.Add(i); 
        }

        public List<int> GetMyListInt(int index)
        {
            return mListe(index); 
        }
 }


Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Christian S. - Mi 09.07.14 23:06

Du benutzt an dieser Stelle mListe aber als Funktion (nämlich mit runden Klammern dahinter, was dann aussieht wie ein Methodenparamater) und eine Funktion diesen Namens gibt es ja nicht. Du willst sicherlich den Arrayzugriff mittels eckigen Klammern.

Außerdem soll GetMyListInt wahrscheinlich keine Liste, sondern einen einzelnen Integer zurückgeben, oder?


Ralf Jansen - Do 10.07.14 00:39

Denn Ballast sehe ich jetzt nicht so hoch.
So würde ich mir das vorstellen.


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:
class Class1
{
    private MyCheckedIntegerList mListe = new MyCheckedIntegerList();
    public IList<int> MyIntListe
    {
        get
        {
            return mListe;
        }            
    }

    public class MyCheckedIntegerList : Collection<int>
    {
        public MyCheckedIntegerList() { }
        public MyCheckedIntegerList(IList<int> list) : base(list) { }

        protected override void InsertItem(int index, int item)
        {
            // irgendeine Prüfung
            if (item <= 0)
                throw new ArgumentOutOfRangeException("Value must be greater than 0.""item");

            base.InsertItem(index, item);
        }
    }
}


Palladin007 - Do 10.07.14 10:36

Dafür könnte man ja theoretisch auch eine eigene Klasse schreiben, die dann einen weiteren Konstruktor anbietet und dort eine Validierungs-Funktion entegegen nimmt.


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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
public class ValidatingList<T> : IList<T>
{
    private readonly IList<T> _list;
    private readonly Predicate<T> _validate;

    public int Count
    {
        get { return _list.Count; }
    }
    public bool IsReadOnly
    {
        get { return _list.IsReadOnly; }
    }
    public T this[int index]
    {
        get { return _list[index]; }
        set
        {
            ValidateWithException(value);
            _list[index] = value;
        }
    }

    public ValidatingList(Predicate<T> validate)
        : this(new List<T>(), validate)
    {
    }
    public ValidatingList(IList<T> list, Predicate<T> validate)
    {
        if (validate == null)
            throw new ArgumentNullException("validate");

        _validate = validate;
        _list = list ?? new List<T>();
    }

    public virtual bool Validate(T item)
    {
        return _validate(item);
    }
    private void ValidateWithException(T item)
    {
        if (!Validate(item))
            throw new ArgumentException("invalid item");
    }

    public void Insert(int index, T item)
    {
        ValidateWithException(item);
        _list.Insert(index, item);
    }
    public void Add(T item)
    {
        ValidateWithException(item);
        _list.Add(item);
    }

    // IList<T>-Implementierungen ...
}



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var list = new ValidatingList<string>(x => x != null);

list.Add("a");
list.Add("b");
list.Add(null); // -> Exception

var item = "asdf";
if (list.Validate(item))
    list.Add(item);
// ...


mmgg - Do 10.07.14 22:45

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Du benutzt an dieser Stelle mListe aber als Funktion (nämlich mit runden Klammern dahinter, was dann aussieht wie ein Methodenparamater) und eine Funktion diesen Namens gibt es ja nicht. Du willst sicherlich den Arrayzugriff mittels eckigen Klammern.

Außerdem soll GetMyListInt wahrscheinlich keine Liste, sondern einen einzelnen Integer zurückgeben, oder?


besten dank, genau das wars. Und dann muss natürllich die Function typ int zurückgeben, statt List<int>.

@all
thanks für dei Beispiele.
Eine Liste als property kuck ich mir nochmal an, den mit den zwei Methoden kann man später zum auslesen kein foreach nehmen.


mmgg - Do 10.07.14 22:59

Ich bin gerade dabei, hab also Palladin007 Code eingefügt, und es heisst für diese Zeile:
"does not implementäte interface member System.Collections.Generic.IList"

Warum das, es fehlt kein Namensraum
"using System.Collections.Generic;" ist dabei.
Und mehr als die Schnittstelle dann da anzuhängen, geht doch nicht?


Ralf Jansen - Do 10.07.14 23:47

Er hat nicht alle Methoden von IList<T> implementiert sondern nur die wichtigsten um dir das Verfahren zu zeigen. Drum der Codekommentar '// IList<T>-Implementierungen ...' am Ende.

Wenn du im Editor mal auf IList<T> das Contextmenü öffnest sollte du den erste Eintrag 'Implement Interface' (oder eben das deutschsprachige Äquivalent wenn du ein deutsches Visual Studio verwendest) mal ausführen. Das generiert dir dann die noch fehlenden Methoden die du dann im Anschluss mit sinnvollem Code füllen musst. Läuft im Prinzip darauf hinaus in diesen Methoden den Aufruf an die jeweilige gleichnamige Methode von _list weiterzuleiten.


mmgg - Sa 12.07.14 20:57

das ging auf anhieb, danke dafür.

Ich kann die Klasse "ValidatingList" bis jetzt nicht anwenden.
Der Error passeirt in dieser Zeile: _list.Add(item);


C#-Quelltext
1:
2:
3:
4:
5:
 public void Add(T item)
        {
            ValidateWithException(item);
            _list.Add(item);
        }


Die Errormessage heisst zwar "... wurde nicht auf eine Objectinstanz festgelegt", aber IList ist eine abstracte Klasse, kann also nicht initzialisiert werden?

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Palladin007 - Sa 12.07.14 22:12

Ach sie an, ich hab vergessen, _list zu instanziieren.

Musst du halt im Konstruktor noch machen. Setze den list-Parameter im zweiten Konstruktor, vergiss aber nicht zu prüfen, ob der null ist und wenn ja, erstelle eine neue Liste.


mmgg - Di 15.07.14 22:10

Hi Palladin,
das war auch mein erster Gedanke, aber ILIst ist eine abstrakte Klasse, kann also nicht initialisiert werden.


Palladin007 - Di 15.07.14 22:23

IList ist ein Interface und List implementiert dieses Interface.

Du solltest dringend die Grundlagen nacholen
Auf galileo computing gibts ein Buch, das nennt sich Visual C# 2012


mmgg - Mi 16.07.14 03:12

Glaub ich nicht, ich würd ja auch keinen Mathe-Prof zurück auf die Schulbank schicken, weil er sich v-e-r-r-e-c-h-n-e-t hat.

Ich wünschte ich hätte diese Antwort voher gelesen, bevor ich den andern Thread nochmal angeschoben hab.

Diese Antwort hier, ist wahrscheinlich wieder so' ne schlimme Antwort, die weitere Antworter vorenthält?
By the way, die Post-Frequenz in solchen Foren war schon mal höher.


Christian S. - Mi 16.07.14 07:43

user profile iconmmgg hat folgendes geschrieben Zum zitierten Posting springen:
Glaub ich nicht, ich würd ja auch keinen Mathe-Prof zurück auf die Schulbank schicken, weil er sich v-e-r-r-e-c-h-n-e-t hat.
So oft, wie Du Dich in diesem Thread "verrechnet" hast, zeigt das eigentlich schon, dass es da an Grundlagen fehlt. :nixweiss:

user profile iconmmgg hat folgendes geschrieben Zum zitierten Posting springen:
By the way, die Post-Frequenz in solchen Foren war schon mal höher.
Stimmt. Und jetzt? :shock:


Palladin007 - Mi 16.07.14 08:55

Es geht ja auch nicht einmal darum, dass du dich "verrechnet" hast, sondern dass du nicht die nötigen Mittel kennst, damit du dich nicht "verrechnest".
Einen Mathe-Prof würdest du wahrcheinlich doch auf die Schulbank schicken, wenn er die Formeln und Rechenwege nicht kennt, oder?


mmgg - Mi 16.07.14 21:17

"sondern dass du nicht die nötigen Mittel kennst"
Du magst das so folgern, aus meiner Antwort "aber ILIst ist eine abstrakte Klasse..."
Was sollte man auch sonst Folgern?


Palladin007 - Mi 16.07.14 21:33

Dass dir Grundlagen fehlen ist klar, das war auch schon vorher klar, deshalb habe ich dir das Buch empfohlen, was sich nebenbei bemerkt ziemlich gut liest.
Hier klagt niemand irgendwen an, weil Grundlagen fehlen, aber ich finde es nicht gut, dass die Hilfe, die wir bieten, nicht angenommen wird.


mmgg - Sa 19.07.14 03:06

user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Dass dir Grundlagen fehlen ist klar, das war auch schon vorher klar,

Nein, ist nicht klar, Du glaubts das sehen zu können. Du bist einer von denen die so denken, bestimmt hast du auch die gute mehrheit auf deiner seite.


Zitat:
Einen Mathe-Prof würdest du wahrcheinlich doch auf die Schulbank schicken, wenn er die Formeln und Rechenwege nicht kennt, oder?

ho ho ho, wenn er die rechenwege nicht kennt.... gut, keep going, nice to meet you.


mmgg - Sa 01.11.14 22:24

Die Lösung aus dem Dilemma:
https://stackoverflow.com/questions/2198989/creating-a-generic-ilist-instance-using-reflection

Hat man also eine KLasse wie diese, dann lässt sich _list so instanzieren:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public class ValidatingList<T> : IList<T>
{
    private  IList<T> _list;

    public ValidatingList()
    {
        _list = new List<T>(); // hier
    }

    //obligacions of this Interface
}


Auf der ersten Seite dieses Threads, schrieb ich irgendwo, dass ich IList nicht instanzieren kann, weil abstrakte Klassen nicht nicht nun mal nicht instanzieren lassen.
Es hätte natürlich Interface heissen müssen. Die Errormessage die ich immer wieder bekam hiess: "abstrakte Klasse oder Interface kann nicht..."
Ja, ist so, - nur wie dann?
Dass eine Variable vom Typ IList<T> sich so instanzieren lässt(wie oben) das konnte hier keiner schreiben, stattdessen festbeissen an meinem 'Versprecher'(Interface statt abstracte klasse) . Festgebissen, draufgestürtzt- so ungefähr: na Gott sei dank.

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt


Palladin007 - Sa 01.11.14 22:54

Dein Code-Beispiel zählt im übrigen zu den absoluten Grundlagen überhaupt, womit wir wieder beim Thema wären ...


Ganz ehrlich, ich verstehe dein Problem nicht.
Gibt es überhaupt noch ein Problem, bei dem wir helfen können?
Ich bin auch thematisch komplett raus und habe keine Lust, alles nochmal zu lesen.


Ralf Jansen - So 02.11.14 00:07

Zitat:
Dass eine Variable vom Typ IList<T> sich so instanzieren lässt(wie oben) das konnte hier keiner schreiben,


Es hat keiner gesagt weil das falsch wäre. Hast du eventuell immer noch ein falsches Meta-model im Kopf was Interfaces sind?

Interfaces werden nicht instanziiert oder irgendwas in der Art. Interfaces sind ein reiner Vertrag mit der eine Klasse aussagt 'Ich kann die Dinge die Interface x verlangt'.
Und Variablen kann man genauso wenig instanziieren. Variablen zeigen auf Objekte von Klassen die instanziiert werden und möglicherweise ein Interface implementieren.
Ein Variable vom Typ IList<T> sagt also nur aus ich kann auf Klassen veweisen die IList<T> können. Welche das konkret ist ist der VAriablen egal.

Zitat:
stattdessen festbeissen an meinem 'Versprecher'(Interface statt abstracte klasse)


Das es ein Versprecher war weißt nur du. Deine Ausdrucksweise ließ(und lässt immer noch) anderes vermuten. Wir können bei sowas nur annehmen das du da was missverstanden hast und darauf hinweisen und versuchen es zu erklären. Wenn sich einer an was festbeißt bist du es in dem du alte Threads ausgräbst um irgendwas zu beweisen von dem ich nicht weiß was das sein soll.


mmgg - Di 04.11.14 19:56

Eure Antworten in einer Talkshow plaziert, würde man sie bewerten als: Die Kunst den anderen absichtlich falsch zu verstehen.


Palladin007 - Di 04.11.14 20:15

Wenn du das so schreibst, dann zitiere ich einmal mich selber und kommentiere das Geschriebene im Bezug auf deine letzte Antwort:

Zitat:
Dein Code-Beispiel zählt im übrigen zu den absoluten Grundlagen überhaupt, womit wir wieder beim Thema wären ...


Code kann man nicht falsch verstehen, man kann ihn nur gar nicht verstehen.


Zitat:
Ganz ehrlich, ich verstehe dein Problem nicht.
Gibt es überhaupt noch ein Problem, bei dem wir helfen können?
Ich bin auch thematisch komplett raus und habe keine Lust, alles nochmal zu lesen.


Ich beziehe mich hier überhaupt auf nichts vorher gesagtes, sondern auf den Thread an sich.
Ich habe um eine Auskunft gebeten, ob es noch ein Problem gibt, bei dem wir helfen können.

Deiner Antwort nach vermutlich eher nicht, also kann ich mir diese sinnlose Diskussion im Grunde auch sparen.
Wenn es noch etwas thematisches gibt, wo wir helfen können, sag Bescheid und dann helfe ich auch gerne - voraus gesetzt, du nimmst Hinweise und Tipps auch so an, wie sie geschrieben wurden.


C# - Di 04.11.14 23:47

Bevor sich hier die Emotionen noch höher schaukeln sage ich auch mal was.

Das hier ist ein Forum und dafür da, dass Entwickler anderen Entwicklern helfen, wenn diese Probleme haben. Jeder hier hat mit Sicherheit auch besseres zu tun als Andere zu ärgern. Also sollten wir uns alle unsachlichen Kommentare sparen, da die Niemandem helfen - weder dir, noch den Leuten die dir helfen wollen. Und nur weil die "Post-Frequenz" momentan nicht so hoch ist, heißt das nicht, dass die Qualität nachlässt.

Und jetzt zu deinem Problem:
Da hier scheinbar mehrere Personen dein Problem nicht identifizieren können würde ich einfach mal vorschlagen, dass du uns nochmal folgende Infos gibst:

1. Was hast du vor bzw. was willst du erreichen?
2. Wo tritt dein Problem auf, bzw. was verstehst du nicht?
3. Was hast du bisher versucht und was ist dein aktueller Stand der Problemlösung (Quellcode)?


Ich kann hier leider auch nur spekulieren, da ich dein Problem auch nicht sicher verstehe. Für mich sieht es so aus, als hättest du eine Liste mit int-Werten. Zu dieser Liste dürfen keine Zahlen mit dem Wert 0 hinzugefügt werden (wegen Division durch 0 nehme ich an). Ein Lösungsansatz, der relativ leicht ist, wäre eine ObservableCollection<T>:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
 class DeineKlasse
    {
        public ObservableCollection<int> IntListe { get; private set; }

        public DeineKlasse()
        {
            IntListe = new ObservableCollection<int>();
            IntListe.CollectionChanged += IntListeOnCollectionChanged;
        }

        //Hier wird ein neuer WERT zu der Liste hinzugefügt. Das Listen-Objekt bleibt aber das gleiche!!!

        private void IntListeOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            // Wenn neue Werte hinzugefügt wurden, einfach alle Werte mit 0 aus der Liste löschen
            // (falls welche vorhanden sind)

            if (e.Action == NotifyCollectionChangedAction.Add) IntListe.Remove(0);
        }
    }

Von außen kannst du das Teil dann wie eine normale Liste behandlen, sprich:

C#-Quelltext
1:
2:
3:
DeineKlasse klasse1 = new DeineKlasse();
klasse1.IntListe.Add(2);
klasse1.IntListe.Add(0);

Deine Liste sollte danach nur die 2 beinhalten. Die 0 wird zwar kurz hinzugefügt, aber sofort wieder gelöscht.

Falls hier fachlich etwas nicht korrekt sein sollte bitte anmerken. Ich verwende die ObservableCollection<T> eigentlich nicht.


mmgg - Sa 08.11.14 21:19

user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:
Das hier ist ein Forum und dafür da, dass Entwickler anderen Entwicklern helfen, wenn diese Probleme haben.

Ja, so solle es sein.

Und nun zu allem weiteren, du willst sagenPalladin hätte auch ncht gewusst wie man eine IList deklariert?
Sorry, versuch schritt zu halten


Palladin007 - Sa 08.11.14 23:54

Okay, um das ganze Chaos hier mal auf einen Punkt zu bringen, habe ich mir die Beiträge vorher durchgelesen.

Anscheinend hast du dich nach meinem Kommentar
Zitat:
IList ist ein Interface und List implementiert dieses Interface.

Du solltest dringend die Grundlagen nacholen
Auf galileo computing gibts ein Buch, das nennt sich Visual C# 2012

ein bisschen angefressen gefühlt und dafür zumindest Sorry.

Dennoch nehme ich meine Aussage nicht zurück, denn es zählt unter Grundlagen, dass IList ein Interface ist und nicht instanziiert werden kann.
Wie man dennoch eine Instanz mit dem Typ IList bekommt, habe ich ebenfalls genannt, indem ich dich darauf hingewiesen habe, dass die Klasse List das Interface IList implementiert.
Auch das sind Grundlagen.

Es hatte nie etwas damit zu tun, dass du IList als abstrakte Klasse bezeichnet hast, sondern damit, dass du nicht wusstest, wie man eine Instanz mit dem Typ IList bekommt, bzw. wie man Properties richtig nutzt. Daher ruhte meine Aussage zu den Grundlagen.
Was mich (und wahrscheinlich auch einige Andere) stört, ist, dass du dich nicht einfach damit abfinden kannst, das dir Grundlagen fehlen (so ist zumindest mein Eindruck). Ich will nicht sagen, dass das schlimm ist, schließlich fängt jeder mal an, aber gerade Anfänger sollte auch auf die Tipps hören, die ihnen von erfahreneren Entwicklern gegeben werden.

Ich bin kein Moderator und kann kein Machtwort sprechen und ich wette auch, in meinen Beiträgen war bestimmt die eine oder andere Formulierung, die diese Situation begünstigt hat. Dennoch würde ich dich bitten, das Thema jetzt endlich ruhen zu lassen, damit wir zum eigentlichen Thema zurück kehren können. Das bedeutet, dass du uns endlich dabei hilfst, deine Problemstellung zu verstehen, nur dann können wir dir auch helfen.



PS @ C#:

Ich finde deine Lösung mit der ObservableCollection etwas unglücklich gewählt.
Das ist zwar eine schnelle und einfache Lösung, aber meiner Auffassung nach nicht gut, denn beim Aufruf einer Add-Methode erwartest du ja, dass das Item hinzu gefügt wird.
Wenn das Item die Validierung aber nicht besteht, wird es wieder entfernt und der Aufrufer erhält darüber keine Information. Im Gegenteil, er erhält dennoch die Information, dass das Item hinzu gefügt wird (über das CollectionChanged-Event).
Du kannst auch nie sicher stellen, dass die Methode zum Validieren an erster Stelle aufgerufen wird, weshalb andere Methoden, die von dem Event aufgerufen werden, schon mit der fertigen Liste und dem fehlerhaften Wert arbeiten.

Die ObservableCollection hat eher einen anderen Grund: Sie implementiert INotifyCollectionChanged und dient dazu, dass Nutzer über Änderungen in der Liste informiert werden.
Ein Anwendungsfall, wo die Liste Gold wert ist, sind Auflistungen in WPF. Die Liste kann sich jeder Zeit ändern und durch INotifyCollectionChanged reagiert die View automatisch darauf.

Ich möchte daher noch mal auf meine Implementierung "ValidatingList eine Seite zuvor hinweise. Die validiert noch vor dem Hinzufügen in die Liste und wirft eine Exception, wenn der Wert nicht stimmt.
Man könnte das auch anders machen, z.B. indem nicht IList implementiert, sondern von List (oder Collection) abgeleitet und die Add-Methode überschrieben wird. Das ist denke ich geschmackssache.


Th69 - So 09.11.14 10:42

Nur zur Info: ich habe dieses Thema schon verfolgt, und war auch kurz davor, ihn zu schließen - aber ich wollte niemanden eine Antwort vorenthalten.

Ich denke aber, daß jetzt inhaltlich alles zu diesem Thema geschrieben wurde und daher dieses Thema jetzt ruhen sollte.

Btw: die Lösung mittels ObservableCollection (und Löschen des Eintrags nach der Validierung) halte ich auch hier nicht für die Beste.