myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » Liste mit Wörtern erstellen, die mit ersten Zeichen der Suche übereinstimmen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Liste mit Wörtern erstellen, die mit ersten Zeichen der Suche übereinstimmen

 
Beiträge zu diesem Thema Autor Datum
 Liste mit Wörtern erstellen, die mit ersten Zeichen der Suche übereinstimmen Serilla 15.10.2019 08:31
 RE: Liste mit Wörtern erstellen, die mit ersten Zeichen der Suche übereinstimmen Alf Ator 15.10.2019 10:01
 RE: Liste mit Wörtern erstellen, die mit ersten Zeichen der Suche übereinstimmen Th69 15.10.2019 10:02
 RE: Liste mit Wörtern erstellen, die mit ersten Zeichen der Suche übereinstimmen Serilla 15.10.2019 10:24
 RE: Liste mit Wörtern erstellen, die mit ersten Zeichen der Suche übereinstimmen Serilla 15.10.2019 12:45
 RE: Liste mit Wörtern erstellen, die mit ersten Zeichen der Suche übereinstimmen Th69 15.10.2019 13:02
 RE: Liste mit Wörtern erstellen, die mit ersten Zeichen der Suche übereinstimmen Alf Ator 15.10.2019 17:25
 RE: Liste mit Wörtern erstellen, die mit ersten Zeichen der Suche übereinstimmen MarsStein 16.10.2019 10:08

Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Serilla
myCSharp.de-Mitglied

Dabei seit: 15.10.2019
Beiträge: 3


Serilla ist offline

Liste mit Wörtern erstellen, die mit ersten Zeichen der Suche übereinstimmen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo miteinander,

ich möchte einen Prefix Tree erstellen, der mir bei einer Suche eine Liste mit Wörtern ausgibt, die mit den ersten Zeichen der Suche übereinstimmen.

Mein Problem ist, dass ich bei meiner Suche nur ein "Trees.PrefixTree+d__5" erhalte und keine Liste mit Wörtern (der Array "dictionary" ist als Beispiel gedacht) und ich verstehe nicht warum. Kann mir jemand weiterhelfen?

Vielen Dank!

C#-Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;



namespace Trees
{

    public class Program
    {
        public static void Main()
        {

            //String[] file = File.ReadAllLines(@"C:\Users\samue\Desktop\Neuer Ordner (2)\liste.txt");


            string[] dictionary = new string[] { "test", "try", "angle", "the", "code", "is", "isnt" };
            PrefixTree trie = new PrefixTree();

            var stopwatch = new Stopwatch();

            foreach (var word in dictionary)
            {
                trie.Add(word);
            }

            //Thread workerThread = new Thread(trie.Search(suchwort);

            Console.WriteLine("Bitte geben Sie Ihren Suchbegriff ein:");
            string suchwort = Console.ReadLine();
            Console.WriteLine("Suchergebnis:");
            Console.WriteLine(trie.Search("te"));
        }
    }

    public class PrefixTree
    {
        private PrefixTreeNode root;

        public PrefixTree()
        {
            root = new PrefixTreeNode(String.Empty);
        }

        public void Add(string word)
        {
            AddRecursive(root, word, String.Empty);
        }

        private void AddRecursive(PrefixTreeNode node, string remainingString, string currentString)
        {
            if (remainingString.Length <= 0)
            {
                return;
            }

            char prefix = remainingString[0];
            string substring = remainingString.Substring(1);
            if (!node.SubNodes.ContainsKey(prefix))
            {
                node.SubNodes.Add(prefix, new PrefixTreeNode(currentString + prefix));
            }

            if (substring.Length == 0)
            {
                node.SubNodes[prefix].IsWord = true;
                return;
            }
            else
            {
                AddRecursive(node.SubNodes[prefix], substring, currentString + prefix);
            }
        }


        public IEnumerable<string> Search(string searchString)
        {
            PrefixTreeNode node = root;
            foreach (var search in searchString)
            {
                if (!node.SubNodes.ContainsKey(search))
                {
                    return new string[0];
                }
                node = node.SubNodes[search];
            }

            return FindAllWordsRecursive(node);
        }

        private IEnumerable<string> FindAllWordsRecursive(PrefixTreeNode node)
        {
            if (node.IsWord)
            {
                yield return node.Word;
            }

            foreach (var subnode in node.SubNodes)
            {
                foreach (var result in FindAllWordsRecursive(subnode.Value))
                {
                    yield return result;
                }
            }
        }

        protected class PrefixTreeNode
        {
            private readonly Dictionary<char, PrefixTreeNode> subNodes;
            private bool isWord;
            private readonly string word;

            public PrefixTreeNode(string word)
            {
                subNodes = new Dictionary<char, PrefixTreeNode>();
                isWord = false;
                this.word = word;
            }

            public Dictionary<char, PrefixTreeNode> SubNodes { get { return subNodes; } }
            public bool IsWord { get { return isWord; } set { isWord = value; } }
            public string Word { get { return word; } }
        }
    }

}

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Serilla am 15.10.2019 08:32.

15.10.2019 08:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Alf Ator
myCSharp.de-Mitglied

avatar-586.gif


Dabei seit: 30.10.2007
Beiträge: 597
Entwicklungsumgebung: VS2005 / VS2008


Alf Ator ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Serilla


Search(..) gibt ein IEnumerable<string> zurück. Console.WriteLine(..) erwartet aber einen string.
Versuchmal aus dem Rückgabewert von Search einen String zu machen.

Z.B. mit string.Join(...)

Gruß
Alf
15.10.2019 10:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.576
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist online

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo und willkommen,

du gibst ja bei der Search-Methode ein IEnumerable<string> zurück (also quasi eine Liste), gibst diese aber direkt per Console.WriteLine aus, so daß einfach dessen  ToString()-Methode aufgerufen wird (die standardmäßig den Datentypnamen ausgibt).
Du mußt die Strings einzeln in einer Schleife ausgeben:

C#-Code:
foreach (string s in trie.Search("te"))
    Console.WriteLine(s);

(oder alternativ z.B. String.Join(...) benutzen)
15.10.2019 10:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Serilla
myCSharp.de-Mitglied

Dabei seit: 15.10.2019
Beiträge: 3

Themenstarter Thema begonnen von Serilla

Serilla ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vielen Dank! Klappt hervorragend!
15.10.2019 10:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Serilla
myCSharp.de-Mitglied

Dabei seit: 15.10.2019
Beiträge: 3

Themenstarter Thema begonnen von Serilla

Serilla ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wenn ich versuche den obigen Code mit Multitasking starte, bekomme ich keine Rückgabe. Weiß jemand warum?

C#-Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;



namespace Trees
{

    public class Program
    {
        public static void Main()
        {

            String[] file = File.ReadAllLines(@"C:\Users\samue\Desktop\Neuer Ordner (2)\liste.txt");
            //string[] dictionary = new string[] { "test", "try", "angle", "the", "code", "is", "isnt" };

            PrefixTree trie = new PrefixTree();

            var sw = new Stopwatch();
            foreach (var word in file)
            {
                trie.Add(word);
            }

            Task.Run(() => trie.Suche());

        }
    }

    public class PrefixTree
    {
        private PrefixTreeNode root;

        public PrefixTree()
        {
            root = new PrefixTreeNode(String.Empty);
        }

        //Rekursives Einfügen der Worte
        public void Add(string word)
        {
            AddRecursive(root, word, String.Empty);
        }

        private void AddRecursive(PrefixTreeNode node, string remainingString, string currentString)
        {
            if (remainingString.Length <= 0)
            {
                return;
            }

            char prefix = remainingString[0];
            string substring = remainingString.Substring(1);
            if (!node.SubNodes.ContainsKey(prefix))
            {
                node.SubNodes.Add(prefix, new PrefixTreeNode(currentString + prefix));
            }

            if (substring.Length == 0)
            {
                node.SubNodes[prefix].IsWord = true;
                return;
            }
            else
            {
                AddRecursive(node.SubNodes[prefix], substring, currentString + prefix);
            }
        }

        public void Suche()
        {
            PrefixTree trie = new PrefixTree();
            var sw = new Stopwatch();
            Console.WriteLine("Bitte geben Sie Ihren Suchbegriff ein:");
            string suchwort = Console.ReadLine();
            Console.WriteLine("Suchergebnis:");
            sw.Start();
            Console.WriteLine(string.Join(", ", trie.Search(suchwort)));
            sw.Stop();
            Console.WriteLine("Laufzeit der Suche" + sw.Elapsed);

        }
        //Rekursive Suche nach vollständiger Wortliste bei gegebenem Prefix
        public IEnumerable<string> Search(string searchString)
        {
            Console.WriteLine("Task gestartet");
            PrefixTreeNode node = root;
            foreach (var search in searchString)
            {
                if (!node.SubNodes.ContainsKey(search))
                {
                    return new string[0];
                }
                node = node.SubNodes[search];
            }
            var result = FindAllWordsRecursive(node);
            Console.WriteLine(string.Join(", ", result));
            return FindAllWordsRecursive(node);
        }

        private IEnumerable<string> FindAllWordsRecursive(PrefixTreeNode node)
        {
            if (node.IsWord)
            {
                yield return node.Word;
            }

            foreach (var subnode in node.SubNodes)
            {
                foreach (var result in FindAllWordsRecursive(subnode.Value))
                {
                    yield return result;
                }
            }
        }

        protected class PrefixTreeNode
        {
            private readonly Dictionary<char, PrefixTreeNode> subNodes;
            private bool isWord;
            private readonly string word;

            public PrefixTreeNode(string word)
            {
                subNodes = new Dictionary<char, PrefixTreeNode>();
                isWord = false;
                this.word = word;
            }

            public Dictionary<char, PrefixTreeNode> SubNodes { get { return subNodes; } }
            public bool IsWord { get { return isWord; } set { isWord = value; } }
            public string Word { get { return word; } }
        }
    }
}

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Serilla am 15.10.2019 12:46.

15.10.2019 12:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.576
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist online

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Durch das "Task.Run(() => trie.Suche());" startest du zwar einen neuen Task, aber weil danach die Main-Methode zu Ende ist, beendet sich das gesamte Programm sofort.

Was bezweckst du denn mit dem Multi-Tasking konkret (denn bisher macht dein Programm ja nichts anderes als die Suche zu starten)?

Ansonsten s.a.  [Artikel] Multi-Threaded Programmierung sowie weitere Tutorials im Netz über Multi-Tasking (Task, async, await).
15.10.2019 13:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Alf Ator
myCSharp.de-Mitglied

avatar-586.gif


Dabei seit: 30.10.2007
Beiträge: 597
Entwicklungsumgebung: VS2005 / VS2008


Alf Ator ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Als Quickfix hilft möglicherweise ein Console.ReadLine() am Ende.

Richtiger wäre es dann die Methode Search mit dem  async-Keyword auszustatten und mit dem Rückgabewert (z.B. Task<IEnumerable<string>>) zu arbeiten.
Consolen-Ausgaben (wie alle UI-Geschichten) laufen dann nicht in einem Task, sondern im Mainthread.

Absehen davon schau dir noch mal das an:  Wie poste ich richtig?
Das hilft im Forum die Übersicht zu bewahren.

Gruß
Alf
15.10.2019 17:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 3.149
Entwicklungsumgebung: VS 2013, MonoDevelop
Herkunft: Trier -> München


MarsStein ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

hinzu kommt noch, dass Du in Deiner Suche()-Methode eine neue Instanz von PrefixTree erstellst, auf der Du dann weiterarbeitest.
Diese Instanz kennt aber die in der Main-Methode hinzugefügten Wörter nicht...

Gruß, MarsStein
16.10.2019 10:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 7 Monate.
Der letzte Beitrag ist älter als 7 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 26.05.2020 14:21