Aracılığıyla paylaş


Nasıl yapılır: sorgu sözcükleri (LINQ) belirlenen içeren cümleler için

Bu örnek cümleler belirlenen sözcükler için eşleşmelere sahip bir metin dosyasını bulmak nasıl gösterir.Bu örnekte sabit kodlanmış arama terimleri bir dizi olmasına rağmen bunu da dinamik olarak zamanında doldurulmasını.Bu örnekte, "Geçmişte" sözcüklerini içeren cümleler sorgu döndürür "veri" ve "tümleşik."

Örnek

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
*/

Sorgu metni cümle ilk bölme ve cümle her sözcüğü basılı dizelerden oluşan bir dizi sonra bölme çalışır.Bu diziler için Distinct yöntemi, tüm yinelenen sözcükleri kaldırır ve sorgu gerçekleştirir bir Intersect işlem sözcük dizisi ve wordstoMatch dizi.Kesişim sayısı sayısı ile aynı olup olmadığını wordsToMatch dizi, tüm sözcükleri, sözcük bulundu ve özgün cümleyi döndürülür.

Yapılan çağrıda Split, noktalama işaretleri, ayırıcı olarak bunları dizeden kaldırmak için kullanılır.Bu, sahip bir dize "Tarihsel" Örneğin yapmadınız, değil uyan "Tarihsel" de wordsToMatch dizi.Kaynak metinde bulunan noktalama türlerine bağlı olarak, ek ayırıcıları kullanmak zorunda kalabilirsiniz.

Kod Derleniyor

  • Oluşturma bir Visual Studio hedefleyen proje .NET Framework sürüm 3.5.Varsayılan olarak, proje başvuru System.Core.dll sahiptir ve bir using yönergesi (C#) veya Imports deyimi (Visual Basic) System.Linq ad alanı.C# projeleri, ekleme bir using yönergesi System.IO ad alanı.

  • Projenize bu kodu kopyalayın.

  • Derlemek ve program çalıştırmak için F5 tuşuna basın.

  • Konsol penceresine çıkmak için herhangi bir tuşa basın.

Ayrıca bkz.

Kavramlar

LINQ ve dizeleri