Laden...

foreach Schleife zum sortieren nach Buchstabenanzahl

Erstellt von pata1990 vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.584 Views
P
pata1990 Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren
foreach Schleife zum sortieren nach Buchstabenanzahl

Hallo,

ich bin grad am verzweifeln.
Ich benötige eine foreach schleife mit Hilfe von IEnumrable Interface das mir strings in einer Liste der Buchstabenanzahl nach sortiert.
IEnumarable is eher weniger das Problem, komme seid Stunden einfach nicht drauf wie ich diese foreach Schleife implementieren kann.

Vll hat hier ja jemand eine Idee

Mfg

189 Beiträge seit 2014
vor 8 Jahren

Hallo pata1990,
kannst du bitte deine Anforderung, dein Ist- und dein Soll-Stand etwas ausführlicher beschreiben, als in diesem einen verknoteten Satz?!
Eine List of string ist doch schon ein IEnumerable.

VG Ezio

2.207 Beiträge seit 2011
vor 8 Jahren

Hallo pata1990,

scheitert es an dem Foreach oder an dem, was du in dem Foreach machen sollst? Das hab ich noch nicht geschnallt. Im zweiteren Fall ist der Titel des Threads einfach irreführend.

Zu deinem zweiten Problem: Eine Liste hat eine Sort-Methode. Schau dir die mal an.

List<T>.Sort Method (Comparison<T>) und ein OrderBy hats auch noch 😃

Gruss

Coffeebean

P
pata1990 Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren

Es muss auf jedenfalls eine foreach Schleife sein die die Liste sortiert.

Mein Aktueller Stand ist dass ich eine Liste angelegt habe welcher ich 4 Elemente mit Hilfe einer Add Funktion ein Wort im string Format zufüge.

Dieses muss nun mit Hilfe einer foreach Schleife sortiert werden. Daran scheitert es aktuell.

189 Beiträge seit 2014
vor 8 Jahren

Hallo pata1990,

verstehe ich das richtig, dass du uns nach einem Algorithmus fragst?
Dann verweise ich auf die Stichwörter: Sortieren, Bubble-Sort

1.029 Beiträge seit 2010
vor 8 Jahren

Hi,

nun - eine List<string> kann bereits automatisch sortieren - mittels OrderBy. Ähnliches geht über Array.Sort.

Ich vermute, dass es sich hier um eine Schulaufgabe handelt - insofern empfehle ich an der Stelle einfach eine beliebige Implementierung des BubbleSort-Algorithmus. (siehe Google)

LG

P
pata1990 Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren

Bubblesort kenne ich so nur mit int
ist das mit strings auch möglich?

2.207 Beiträge seit 2011
vor 8 Jahren

Hallo pata1990,

du willst doch, wenn ich das richtig verstanden habe, die Länge eines Strings - und das ist wieder ein int.

[Hinweis] Bitte schau in die SDK-/MSDN-Doku

String.Length Property

Gruss

Coffeebean

W
955 Beiträge seit 2010
vor 8 Jahren

Du sollst doch nach Stringlänge sortieren. Also sind es doch sowoeso integers.

P
pata1990 Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren

Aber wie kann ich denn eine Liste mit BubbleSort sortieren?
Das geht doch eig nur mit Arrays oder ?

2.207 Beiträge seit 2011
vor 8 Jahren

Hallo pata1990,

du kannst über eine Liste genauso iterieren wie über ein Array. Hättest du dir auch nur ein Beispiel angeschaut, hättest du das sofort gesehen. Bitte zeige ein wenig Eigeninitiative.

[Hinweis] Bitte schau in die SDK-/MSDN-Doku
List<T>-Klasse

Du kannst dein Enumerable aber auch mit .ToArray() in ein Array konvertieren und dann darüber iterieren, wenn dir das lieber ist.

Gruss

Coffeebean

P
pata1990 Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren

Wenn ich wie in deiner Info beschrieben die CopyTo Methode anwenden möchte.
Habe ich folgenden Code

Innerhalb der Klasse Liste in welcher meine Liste erstellt wird und sich auch die Add Funktion befindet

        public void CopyTo(Inhalt[] array);

und in meiner Main

  Inhalt[] array = new Inhalt[4];
            l1.CopyTo(array);

            Console.WriteLine("Inhalt Array:");
            foreach(Inhalt t in array)
            {
                Console.WriteLine(t.Text);
            }

Nun bringt er mit aber den Fehler > Fehlermeldung:

CopyTo ist nicht als abstrakt extern oder partiell gekennzeichnet und muss daher einen text deklarieren

2.207 Beiträge seit 2011
vor 8 Jahren

Hallo pata1990,

public void CopyTo(Inhalt[] array);

sieht verdächtig aus. Was genau machst du? Du solltest das CopyTo auf der Liste aufrufen. Und wieso iterierst du nicht über die Liste?

Gruss

Coffeebean

P
pata1990 Themenstarter:in
6 Beiträge seit 2015
vor 8 Jahren

Ich habe mal meinen bisherigen Code angehängt. Wie meinst du das mit iterierst du nicht über die Liste?
In der Liste sind wie unten zu sehen 4 Beliebige Texte welche am Ende dann sortiert ausgegeben werden sollen. Jetzt wollte ich es wie du schon meintest in ein Array kopieren und dann mit Hilfe von BubbleSort sortieren und ausgeben.
(Hat das dann eig überhaupt noch etwas mit IEnumerable und foreach schleife zu tun?)
Sry ich verzweifle grad so ein bisschen an dieser Aufgabe

class Program
    {
        static void Main(string[] args)
        {
            Liste l1 = new Liste();
            l1.Add("Arrrgh");
            l1.Add("Uharrghh");
            l1.Add("Grrr");
            l1.Add("Ugh");

            foreach (Inhalt t in l1)
            {
                Console.WriteLine(t.Text);
            }

            foreach (Inhalt t in l1)
            {
                
            }

            /*Inhalt[] array = new Inhalt[4];
            l1.CopyTo(array);

            Console.WriteLine("Inhalt Array:");
            foreach(Inhalt t in array)
            {
                Console.WriteLine(t.Text);
            }*/


            Console.ReadKey();
        }
    }

    class Liste : IEnumerable
    {
        //Deklaration
        List<Inhalt> l1;
        //Konsturktor
        public Liste()
        {
            l1 = new List<Inhalt>();
        }
        //AddMethode
        public void Add(string t)
        {
            Inhalt insert = new Inhalt(t);
            l1.Add(insert);
        }
        //Indexer
        public string this[string i]
        {
            get
            {
                string s = "nicht gefunden";
                foreach (Inhalt inhalt in l1)
                {
                    if (inhalt.Text == i)
                    {
                        s = inhalt.Text;
                    }
                }
                return s;
            }
        }

        public IEnumerator GetEnumerator()
        {
            foreach (Inhalt t in l1)
            {
                yield return t;
            }

        }

        public void CopyTo(Inhalt[] array);

    }


    class Inhalt
    {
        //Deklarierung
        string text;
        //Properties
        public string Text { get { return text; } }
        //Konstruktor
        public Inhalt(string t)
        {
            text = t;
        }
    }
}
1.040 Beiträge seit 2007
vor 8 Jahren

Deine Klasse 'Liste' schmeißt du jetzt erstmal komplett weg.
Dann guckst du dir, wie von Coffeebean schon gesagt, die List<T>-Klasse an.
Damit kannst du arbeiten und alles machen, was du machen willst.

A
764 Beiträge seit 2007
vor 8 Jahren

Deine Klasse 'Liste' schmeißt du jetzt erstmal komplett weg.

Ich könnte mir vorstellen, dass das mit zur Aufgabe gehört.

J
33 Beiträge seit 2015
vor 8 Jahren

Also kannst auch so lösen .... ABER weis nicht ob es in deiner Aufgabe erlaubt ist.

static void Main(string[] args)
        {
            List<string> l1 = new List<string>();
            l1.Add("eins");
            l1.Add("ei");
            l1.Add("ein");
            l1.Add("e");

            foreach (string value in from wort in l1 orderby wort.Length select wort)
            {
                Console.WriteLine(value);

            }
            Console.ReadLine();
        }

Ergebnis: e, ei, ein, eins

je nach dem kannst gerne ausprobieren

3.003 Beiträge seit 2006
vor 8 Jahren

Mir stellt sich die Frage, was genau deine Aufgabe ist:

  • sollst du dass Array manuell kopieren (daher, vielleicht als Schablone, die merkwürdige Methodendeklaration) und dann ein extra von dir geschriebenes Sort drüberjagen?
  • oder geht es nur um das Ergebnis?

Weil C# natürlich bereits Sortieralgorithmen zur Verfügung stellt, mit denen man die Aufgabe ohne extra-Klasse in einer Zeile erledigen kann.


var myList = new List<string> { "Arrrgh", "Uharrghh", "Grrr", "Ugh" };
var sortedList = myList.OrderBy(p => p.Length).AsEnumerable();
//fertig.

Weshalb ich stark vermute, dass du Punkt 1 erledigen sollst (sonst hätte ich den Code auch nicht gepostet 😁 ).

  1. Schreib' dir ein BubbleSort mit int.
  2. Erweitere dein Bubblesort so, dass du nicht über int, sondern über eine Objekteigenschaft, die int ist, sortierst.
  3. Füttere dein erweitertes Bubblesort mit den strings und sortiere nach deren Länge (= eine int-Eigenschaft)
  4. Profit.

LaTino
[EDIT]: Achja, und BubbleSort stinkt 😉

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

16.806 Beiträge seit 2008
vor 8 Jahren

Der Ausdrucksweise nach handelt sich es um eine Schulaufgabe o.Ä.

Linq/OrderBy() ist daher also nicht hilfreich.

3.003 Beiträge seit 2006
vor 8 Jahren

Ja, dachte ich auch, deshalb der 4-Punkte-Plan - sollte ihm eine Richtung weisen. Ich würde nichtmal denken, dass der Lehrer (?) die Beschäftigung mit List<> erwartet. Sieht eher nach einer alten C-Aufgabe aus, die man unvernünftigerweise in C# umsetzen lassen will.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)