How to: Query for Sentences that Contain a Specified Set of Words (LINQ) (C#) (Gewusst wie: Abfragen von Sätzen, die bestimmte Wörter enthalten (LINQ) (C#))How to: Query for Sentences that Contain a Specified Set of Words (LINQ) (C#)

Dieses Beispiel zeigt, wie Sie Sätze in einer Textdatei suchen, die Übereinstimmungen für jedes Wort einer bestimmten Gruppe von Wörtern enthält.This example shows how to find sentences in a text file that contain matches for each of a specified set of words. Obwohl das Array von Suchbegriffen in diesem Beispiel hartcodiert ist, kann es auch zur Laufzeit dynamisch aufgefüllt werden.Although the array of search terms is hard-coded in this example, it could also be populated dynamically at runtime. In diesem Beispiel gibt die Abfrage die Sätze zurück, die die Wörter „Historically“ (ursprünglich), „data“ (Daten) und „integrated“ (integriert) enthalten.In this example, the query returns the sentences that contain the words "Historically," "data," and "integrated."

BeispielExample

class FindSentences  
{  
    static void Main()  
    {  
        string text = @"Historically, the world of data and the world of objects " +  
        @"have not been well integrated. Programmers work in C# or Visual Basic " +  
        @"and also in SQL or XQuery. On the one side are concepts such as classes, " +  
        @"objects, fields, inheritance, and .NET Framework APIs. On the other side " +  
        @"are tables, columns, rows, nodes, and separate languages for dealing with " +  
        @"them. Data types often require translation between the two worlds; there are " +  
        @"different standard functions. Because the object world has no notion of query, a " +  
        @"query can only be represented as a string without compile-time type checking or " +  
        @"IntelliSense support in the IDE. Transferring data from SQL tables or XML trees to " +  
        @"objects in memory is often tedious and error-prone.";  

        // Split the text block into an array of sentences.  
        string[] sentences = text.Split(new char[] { '.', '?', '!' });  

        // Define the search terms. This list could also be dynamically populated at runtime.  
        string[] wordsToMatch = { "Historically", "data", "integrated" };  

        // Find sentences that contain all the terms in the wordsToMatch array.  
        // Note that the number of terms to match is not specified at compile time.  
        var sentenceQuery = from sentence in sentences  
                            let w = sentence.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' },  
                                                    StringSplitOptions.RemoveEmptyEntries)  
                            where w.Distinct().Intersect(wordsToMatch).Count() == wordsToMatch.Count()  
                            select sentence;  

        // Execute the query. Note that you can explicitly type  
        // the iteration variable here even though sentenceQuery  
        // was implicitly typed.   
        foreach (string str in sentenceQuery)  
        {  
            Console.WriteLine(str);  
        }  

        // Keep the console window open in debug mode.  
        Console.WriteLine("Press any key to exit");  
        Console.ReadKey();  
    }  
}  
/* Output:  
Historically, the world of data and the world of objects have not been well integrated  
*/  

Die Abfrage funktioniert, indem der Text zuerst in Sätze aufgeteilt wird. Diese Sätze werden wiederum in ein Array von Zeichenfolgen aufgeteilt, das jedes Wort enthält.The query works by first splitting the text into sentences, and then splitting the sentences into an array of strings that hold each word. Für jedes dieser Arrays entfernt die Distinct-Methode alle Wortduplikate, und anschließend führt die Abfrage einen Intersect-Vorgang für das Wortarray und das wordsToMatch-Array durch.For each of these arrays, the Distinct method removes all duplicate words, and then the query performs an Intersect operation on the word array and the wordsToMatch array. Wenn die Anzahl der Schnittmenge identisch mit der Anzahl des wordsToMatch-Arrays ist, werden alle gefundenen Wörter in den Wörtern und der ursprüngliche Satz zurückgegeben.If the count of the intersection is the same as the count of the wordsToMatch array, all words were found in the words and the original sentence is returned.

Im Aufruf von Split werden die Satzzeichen als Trennlinien verwendet, damit sie aus der Zeichenfolge entfernt werden können.In the call to Split, the punctuation marks are used as separators in order to remove them from the string. Wenn Sie dies nicht getan haben, haben Sie z.B. eine „ursprüngliche“ Zeichenfolge, die „usprünglich“ nicht mit dem wordsToMatch-Array übereinstimmen würde.If you did not do this, for example you could have a string "Historically," that would not match "Historically" in the wordsToMatch array. Sie müssen möglicherweise zusätzliche Trennzeichen verwenden, abhängig von den Satzzeichen, die im Quelltext vorkommen.You may have to use additional separators, depending on the types of punctuation found in the source text.

Kompilieren des CodesCompiling the Code

Erstellen Sie ein neues Projekt, das auf die .NET Framework-Version 3.5 oder höher ausgelegt ist, mit einer Referenz zu System.Core.dll und using-Direktiven für System.Linq- und System.IO-Namespaces.Create a project that targets the .NET Framework version 3.5 or higher, with a reference to System.Core.dll and using directives for the System.Linq and System.IO namespaces.

Siehe auchSee Also

LINQ und Zeichenfolgen (C#)LINQ and Strings (C#)