Udostępnij za pośrednictwem


Porady: zapytanie o zdania zawierające określony zestaw wyrazów (LINQ)

W tym przykładzie przedstawiono znajdowanie zdań w pliku tekstowym, zawierające odpowiedniki dla każdej z określonych wyrazów.Chociaż tablicy wyszukiwanych terminów jest zakodowane w tym przykładzie, to może również wypełniane dynamicznie w czasie wykonywania.W tym przykładzie kwerenda zwraca zdań, które zawierają wyrazy "Historycznie", "dane" i "zintegrowanego".

Przykład

Class FindSentences

    Shared Sub Main()
        Dim text As String = "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. 
        Dim sentences As String() = text.Split(New Char() {".", "?", "!"})

        ' Define the search terms. This list could also be dynamically populated at runtime 
        Dim wordsToMatch As String() = {"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 
        Dim 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 
        For Each str As String In sentenceQuery
            Console.WriteLine(str)
        Next 

        ' Keep console window open in debug mode.
        Console.WriteLine("Press any key to exit.")
        Console.ReadKey()
    End Sub 

End Class 
' Output: 
' Historically, the world of data and the world of objects have not been well integrated
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
*/

Kwerenda działa przez pierwszy podział tekstu na zdań, a następnie dzielenie zdania na tablicę ciągów, które zawierają każdego wyrazu.Dla każdego z tych tablic Distinct``1 metoda usuwa wszystkie duplikaty słów, a następnie wykonuje kwerendę Intersect``1 operacji na tablicy word oraz wordstoMatch tablicy.Jeśli liczba punkt przecięcia jest taka sama jak liczba wordsToMatch tablicy, znaleziono wszystkie wyrazy w wyrazy i zwracana jest zdanie oryginalne.

W wywołaniu Split, znaki interpunkcyjne, są używane jako separatory w celu usunięcia ich z ciągu.Jeśli nie została ta, na przykład "Historycznie" mógł ciąg, który nie zostałby dopasowany "Historycznie" w wordsToMatch tablicy.Należy używać separatorów dodatkowe, w zależności od typów znaki interpunkcyjne w tekście źródłowym.

Kompilowanie kodu

  • Tworzenie Visual Studio projekt, który jest przeznaczony dla .NET Framework w wersji 3.5.Domyślnie projekt zawiera odwołanie do System.Core.dll i using dyrektywy (C#) lub Imports instrukcji (Visual Basic) dla obszaru nazw System.Linq.W języku C# projektów, należy dodać using dyrektywa obszaru nazw System.IO.

  • Skopiuj ten kod do projektu.

  • Naciśnij klawisz F5, aby skompilować i uruchomić program.

  • Naciśnij dowolny klawisz, aby zamknąć okno konsoli.

Zobacz też

Koncepcje

LINQ i ciągi