AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Container-Klassen in C#

Ein Thema von Luckie · begonnen am 15. Nov 2007 · letzter Beitrag vom 15. Nov 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Container-Klassen in C#

  Alt 15. Nov 2007, 14:20
Ich verstehe nur noch Bahnhof.

Jedenfalls habe ich es jetzt mal so gemacht:

Code:
namespace Container_Klasse
{
    public partial class Form1 : Form
    {
        List<Person> PersonenListe = new List<Person>();

        private void UpdateControls()
        {
            toolStripStatusLabel1.Text = PersonenListe.Count.ToString();

            lbEntries.Items.Clear();
            foreach (Person person in PersonenListe)
            {
                lbEntries.Items.Add(person.Name + ", " + person.Vorname);
            }

            tbName.Text = string.Empty;
            tbVorname.Text = string.Empty;

            btnDel.Enabled = (PersonenListe.Count > 0) && (lbEntries.SelectedIndex > -1);
        }

        public Form1()
        {
            InitializeComponent();
            UpdateControls();
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            Person p = new Person(tbName.Text, tbVorname.Text);
            PersonenListe.Add(p);
            tbName.Focus();
            UpdateControls();          
        }

        private void lbEntries_SelectedIndexChanged(object sender, EventArgs e)
        {
            btnDel.Enabled = lbEntries.SelectedIndex > -1;
            if (lbEntries.SelectedIndex > -1)
            {
                tbName.Text = PersonenListe[lbEntries.SelectedIndex].Name;
                tbVorname.Text = PersonenListe[lbEntries.SelectedIndex].Vorname;
            }
        }

        private void btnDel_Click(object sender, EventArgs e)
        {
            if (lbEntries.SelectedIndex > -1)
            {
                PersonenListe.RemoveAt(lbEntries.SelectedIndex);
                UpdateControls();
            }
        }
    }
}
Ist da irgendein schwerwiegender Fehler drin?

Wie könnte ich das ganze jetzt noch nach Name und Vorname sortieren?

Habs:
Code:
        private static int ComparePerson(Person p1, Person p2)
        {
            if (p1.Name == p2.Name)
                return p1.Vorname.CompareTo(p2.Vorname);
            else
                return p1.Name.CompareTo(p2.Name);
        }

        private void UpdateControls()
        {
            toolStripStatusLabel1.Text = PersonenListe.Count.ToString();

            PersonenListe.Sort(ComparePerson);


            lbEntries.Items.Clear();
            foreach (Person person in PersonenListe)
            {
                lbEntries.Items.Add(person.Name + ", " + person.Vorname);
            }

            tbName.Text = string.Empty;
            tbVorname.Text = string.Empty;

            btnDel.Enabled = (PersonenListe.Count > 0) && (lbEntries.SelectedIndex > -1);
        }
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#12

Re: Container-Klassen in C#

  Alt 15. Nov 2007, 14:57
Zitat von Luckie:
Ist da irgendein schwerwiegender Fehler drin?
Ja, eine Menge unnötigen Code.
Kompilere einmal dein Projekt, gehe jetzt mal in den Form designer und oben im Menü klickst du auf du Data\Show data sources.
Nun legst du in dem neuen Toolwindow eine neue Data source an, im Dialog wählst du Object aus und im nächsten Schritt kannst du deine Klasse "Person" auswählen -> Finish.
Jetzt kannst du einfach die Eigenschaften Name und Vorname auf dein Formular.
Die Textboxes sind jetzt an diese beiden Eigenschaften in der PersonBindingSource gebunden, die ebenfalls auf dem Form liegt.
Willst du den Navigator nicht haben, kannst du ihn einfach löschen.
Jetzt noch eine ListBox auf dein Form ziehen, und ihr als DataSource die personBindingSource verpassen.


Mehr muss im Form nicht stehen, um all das zu können, was dein Code gemacht hat:

Code:
public partial class Form1 : Form
{
  readonly BindingList<Person> persons = new BindingList<Person>();

  public Form1()
  {
    InitializeComponent();
    personBindingSource.DataSource = persons;
  }

  private void personBindingSource_ListChanged(object sender, ListChangedEventArgs e)
  {
    deleteButton.Enabled = personBindingSource.Position != -1;
    nameTextBox.Enabled   = deleteButton.Enabled;
    vornameTextBox.Enabled = deleteButton.Enabled;
  }

  private void addButton_Click(object sender, EventArgs e)
  {
    personBindingSource.AddNew();
  }

  private void deleteButton_Click(object sender, EventArgs e)
  {
    personBindingSource.RemoveCurrent();
  }
}

In der Klasse würd ich halt INotifyPropertyChange implementieren, um die UI (oder andere) über Änderungen informieren zu können.
Außerdem habe ich noch ToString überschrieben, da das der Defaultwert ist, den eine ListBox darstellt.
Code:
public class Person : INotifyPropertyChanged
{
  string name;
  string vorname;

  public override string ToString()
  {
    return name + ", " + vorname;
  }

  public string Name
  {
    get { return name; }
    set
    {
      if (name == value) return;

      name = value;
      RaisePropertyChanged("Name");
    }
  }

  public string Vorname
  {
    get { return vorname; }
    set
    {
      if (vorname == value) return;

      vorname = value;
      RaisePropertyChanged("Name");
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
  protected void RaisePropertyChanged(string propertyName)
  {
    PropertyChangedEventHandler h = PropertyChanged;

    if (h != null)
      h(this, new PropertyChangedEventArgs(propertyName));

  }
}
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Mephisto81

Registriert seit: 15. Nov 2007
2 Beiträge
 
#13

Re: Container-Klassen in C#

  Alt 15. Nov 2007, 14:57
Hallo,

Zitat von OregonGhost:
Edit: Der Name trügt übrigens. List ist keine verkettete Liste. Allgemein kannst du dich auch mal in "Collection" einlesen, und in die in diesem Zusammenhang interessanten Interfaces IEnumerable, das u.a. von List<T> und auch normalen Arrays implementiert wird.
da würde mich mal interessieren, wie du darauf kommst das List<T> keine "verkettete Liste" ist? Nur weil Array ebenfalls das Interface IEnumerable implementiert, sagt das noch lange nicht aus das beide dasselbe sind, sondern vielmehr, dass beide Konstrukte mit einer foreach-Anweisung iteriert werden können.

Grüße
Mephisto
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#14

Re: Container-Klassen in C#

  Alt 15. Nov 2007, 15:04
Zitat von Mephisto81:
da würde mich mal interessieren, wie du darauf kommst das List<T> keine "verkettete Liste" ist?
Weil es allgemein bekannt ein arraybasierter Container ist.
Es ist die generische Vorsetzung der Arraylist.

LinkedList<T> ist eine verkette Liste.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#15

Re: Container-Klassen in C#

  Alt 15. Nov 2007, 15:06
Zitat von Mephisto81:
Hallo,

Zitat von OregonGhost:
Edit: Der Name trügt übrigens. List ist keine verkettete Liste. Allgemein kannst du dich auch mal in "Collection" einlesen, und in die in diesem Zusammenhang interessanten Interfaces IEnumerable, das u.a. von List<T> und auch normalen Arrays implementiert wird.
da würde mich mal interessieren, wie du darauf kommst das List<T> keine "verkettete Liste" ist? Nur weil Array ebenfalls das Interface IEnumerable implementiert, sagt das noch lange nicht aus das beide dasselbe sind, sondern vielmehr, dass beide Konstrukte mit einer foreach-Anweisung iteriert werden können.

Grüße
Mephisto
Zitat von Windows SDK:
The List class is the generic equivalent of the ArrayList class. It implements the IList generic interface using an array whose size is dynamically increased as required.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#16

Re: Container-Klassen in C#

  Alt 15. Nov 2007, 15:19
Zitat von OregonGhost:
Zitat von Windows SDK:
The List class is the generic equivalent of the ArrayList class. It implements the IList generic interface using an array whose size is dynamically increased as required.
Zitat von Windows SDK:
Die List-Klasse ist die generische Entsprechung der ArrayList-Klasse. Sie implementiert das generische IList-Interface und benutzt ein Array, dessen Größe dynamisch vergrößert und verkleinert wird.
Frei übersetzt, und nix mit verlinkter Liste..
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Container-Klassen in C#

  Alt 15. Nov 2007, 15:26
@elvis: Das ist sicher auch eine Möglichkeit, aber ich wollte ja wissen, wie es von Hand geht, um es zu verstehen. Letztendlich will ich mich etwas in C# einarbeiten, um zu sehen, wie es funktioniert usw.

Zum Vergleichen habe ich jetzt mal eine Klasse implementiert:
Code:
    class PersonComparer: IComparer<Person>
    {
        public enum SortType {Descending = -1, Ascending = 1};
        protected SortType sortType;

        public PersonComparer()
        {
            this.sortType = SortType.Ascending;
        }

        public PersonComparer(SortType st)
        {
            this.sortType = st;
        }

        public SortType HowToSort
        {           
            set{this.sortType = value;}
        }

        public int Compare(Person p1, Person p2)
        {
            if (p1.Name == p2.Name)
                return (int)sortType * p1.Vorname.CompareTo(p2.Vorname);
            else
                return (int)sortType * p1.Name.CompareTo(p2.Name);
        }
    }
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Mephisto81

Registriert seit: 15. Nov 2007
2 Beiträge
 
#18

Re: Container-Klassen in C#

  Alt 15. Nov 2007, 15:31
Hallo,

Zitat von Dax:
Zitat von OregonGhost:
Zitat von Windows SDK:
The List class is the generic equivalent of the ArrayList class. It implements the IList generic interface using an array whose size is dynamically increased as required.
Zitat von Windows SDK:
Die List-Klasse ist die generische Entsprechung der ArrayList-Klasse. Sie implementiert das generische IList-Interface und benutzt ein Array, dessen Größe dynamisch vergrößert und verkleinert wird.
Frei übersetzt, und nix mit verlinkter Liste..
stimmt, hab's gerade (nachdem Oregon geantwortet hatte) mal im MSIL-Code und mittels Reflector überprüft. Danke für eure Infos

Grüße
Mep
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#19

Re: Container-Klassen in C#

  Alt 15. Nov 2007, 16:32
Zitat von Luckie:
@elvis: Das ist sicher auch eine Möglichkeit, aber ich wollte ja wissen, wie es von Hand geht, um es zu verstehen. Letztendlich will ich mich etwas in C# einarbeiten, um zu sehen, wie es funktioniert usw.
Ist ja auch ok, in .Net synchronisiert man halt UI und Daten nicht zu Fuss, dass läuft eigentlich nur per DataBinding.
Wie diese Bindung dann aussieht, kannst du mit einigen Interfaces selbst bestimmen.

Zitat:
Zum Vergleichen habe ich jetzt mal eine Klasse implementiert.
Ginge auch so:

Code:
var sortType = SortType.Blabla;

personenListe.Sort((left, right) -> (int)sortType * (left.Name != right.Name)
                     ? String.Compare(left.Name, right.Name)
                     : String.Compare(left.Vorname, right.Vorname));
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz