Sdílet prostřednictvím


Postupy: Kombinace a porovnávání kolekcí řetězců (LINQ)

Tento příklad ukazuje, jak sloučit soubory, které obsahují řádky textu a potom seřadit výsledky.Konkrétně zobrazuje jak provádět jednoduché sloučení, sjednocení a průnik na dvě sady řádků textu.

Nastavení projektu a textové soubory

  1. Zkopírujte tyto názvy do textového souboru s názvem names1.txt a uložit ve složce řešení:

    Bankov, Peter
    Holm, Michael
    Garcia, Hugo
    Potra, Cristina
    Noriega, Fabricio
    Aw, Kam Foo
    Beebe, Ann
    Toyoshima, Tim
    Guy, Wey Yuan
    Garcia, Debra
    
  2. Zkopírujte tyto názvy do textového souboru s názvem names2.txt a uložit ve složce řešení.Všimněte si, že dva soubory mají názvy některých společné.

    Liu, Jinghao
    Bankov, Peter
    Holm, Michael
    Garcia, Hugo
    Beebe, Ann
    Gilchrist, Beth
    Myrcha, Jacek
    Giakoumakis, Leo
    McLin, Nkenge
    El Yassir, Mehdi
    

Příklad

Class ConcatenateStrings
    Shared Sub Main()

        ' Create the IEnumerable data sources. 
        Dim fileA As String() = System.IO.File.ReadAllLines("../../../names1.txt")
        Dim fileB As String() = System.IO.File.ReadAllLines("../../../names2.txt")

        ' Simple concatenation and sort. 
        Dim concatQuery = fileA.Concat(fileB).OrderBy(Function(name) name)

        ' Pass the query variable to another function for execution
        OutputQueryResults(concatQuery, "Simple concatenation and sort. Duplicates are preserved:")

        ' New query. Concatenate files and remove duplicates 
        Dim uniqueNamesQuery = fileA.Union(fileB).OrderBy(Function(name) name)
        OutputQueryResults(uniqueNamesQuery, "Union removes duplicate names:")

        ' New query. Find the names that occur in both files. 
        Dim commonNamesQuery = fileA.Intersect(fileB)
        OutputQueryResults(commonNamesQuery, "Merge based on intersect: ")

        ' New query in three steps for better readability  
        ' First filter each list separately 

        Dim nameToSearch As String = "Garcia" 
        Dim mergeQueryA As IEnumerable(Of String) = From name In fileA 
                          Let n = name.Split(New Char() {","}) 
                          Where n(0) = nameToSearch 
                          Select name

        Dim mergeQueryB = From name In fileB 
                          Let n = name.Split(New Char() {","}) 
                          Where n(0) = nameToSearch 
                          Select name

        ' Create a new query to concatenate and sort results. Duplicates are removed in Union. 
        ' Note that none of the queries actually executed until the call to OutputQueryResults. 
        Dim mergeSortQuery = mergeQueryA.Union(mergeQueryB).OrderBy(Function(str) str)

        ' Now execute mergeSortQuery
        OutputQueryResults(mergeSortQuery, "Concat based on partial name match """ & nameToSearch & """ from each list:")

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

    End Sub 

    Shared Sub OutputQueryResults(ByVal query As IEnumerable(Of String), ByVal message As String)

        Console.WriteLine(System.Environment.NewLine & message)
        For Each item As String In query
            Console.WriteLine(item)
        Next
        Console.WriteLine(query.Count & " total names in list")

    End Sub 
End Class 
' Output: 

' Simple concatenation and sort. Duplicates are preserved: 
' Aw, Kam Foo 
' Bankov, Peter 
' Bankov, Peter 
' Beebe, Ann 
' Beebe, Ann 
' El Yassir, Mehdi 
' Garcia, Debra 
' Garcia, Hugo 
' Garcia, Hugo 
' Giakoumakis, Leo 
' Gilchrist, Beth 
' Guy, Wey Yuan 
' Holm, Michael 
' Holm, Michael 
' Liu, Jinghao 
' McLin, Nkenge 
' Myrcha, Jacek 
' Noriega, Fabricio 
' Potra, Cristina 
' Toyoshima, Tim 
' 20 total names in list 

' Union removes duplicate names: 
' Aw, Kam Foo 
' Bankov, Peter 
' Beebe, Ann 
' El Yassir, Mehdi 
' Garcia, Debra 
' Garcia, Hugo 
' Giakoumakis, Leo 
' Gilchrist, Beth 
' Guy, Wey Yuan 
' Holm, Michael 
' Liu, Jinghao 
' McLin, Nkenge 
' Myrcha, Jacek 
' Noriega, Fabricio 
' Potra, Cristina 
' Toyoshima, Tim 
' 16 total names in list 

' Merge based on intersect: 
' Bankov, Peter 
' Holm, Michael 
' Garcia, Hugo 
' Beebe, Ann 
' 4 total names in list 

' Concat based on partial name match "Garcia" from each list: 
' Garcia, Debra 
' Garcia, Hugo 
' 2 total names in list
class MergeStrings
    {
        static void Main(string[] args)
        {
            //Put text files in your solution folder 
            string[] fileA = System.IO.File.ReadAllLines(@"../../../names1.txt");
            string[] fileB = System.IO.File.ReadAllLines(@"../../../names2.txt");

            //Simple concatenation and sort. Duplicates are preserved.
            IEnumerable<string> concatQuery =
                fileA.Concat(fileB).OrderBy(s => s);

            // Pass the query variable to another function for execution.
            OutputQueryResults(concatQuery, "Simple concatenate and sort. Duplicates are preserved:");

            // Concatenate and remove duplicate names based on 
            // default string comparer.
            IEnumerable<string> uniqueNamesQuery =
                fileA.Union(fileB).OrderBy(s => s);
            OutputQueryResults(uniqueNamesQuery, "Union removes duplicate names:");

            // Find the names that occur in both files (based on 
            // default string comparer).
            IEnumerable<string> commonNamesQuery =
                fileA.Intersect(fileB);
            OutputQueryResults(commonNamesQuery, "Merge based on intersect:");

            // Find the matching fields in each list. Merge the two  
            // results by using Concat, and then 
            // sort using the default string comparer. 
            string nameMatch = "Garcia";

            IEnumerable<String> tempQuery1 =
                from name in fileA
                let n = name.Split(',')
                where n[0] == nameMatch
                select name;

            IEnumerable<string> tempQuery2 =
                from name2 in fileB
                let n2 = name2.Split(',')
                where n2[0] == nameMatch
                select name2;

            IEnumerable<string> nameMatchQuery =
                tempQuery1.Concat(tempQuery2).OrderBy(s => s);
            OutputQueryResults(nameMatchQuery, String.Format("Concat based on partial name match \"{0}\":", nameMatch));

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }

        static void OutputQueryResults(IEnumerable<string> query, string message)
        {
            Console.WriteLine(System.Environment.NewLine + message);
            foreach (string item in query)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("{0} total names in list", query.Count());
        }
    }
    /* Output:
        Simple concatenate and sort. Duplicates are preserved:
        Aw, Kam Foo
        Bankov, Peter
        Bankov, Peter
        Beebe, Ann
        Beebe, Ann
        El Yassir, Mehdi
        Garcia, Debra
        Garcia, Hugo
        Garcia, Hugo
        Giakoumakis, Leo
        Gilchrist, Beth
        Guy, Wey Yuan
        Holm, Michael
        Holm, Michael
        Liu, Jinghao
        McLin, Nkenge
        Myrcha, Jacek
        Noriega, Fabricio
        Potra, Cristina
        Toyoshima, Tim
        20 total names in list

        Union removes duplicate names:
        Aw, Kam Foo
        Bankov, Peter
        Beebe, Ann
        El Yassir, Mehdi
        Garcia, Debra
        Garcia, Hugo
        Giakoumakis, Leo
        Gilchrist, Beth
        Guy, Wey Yuan
        Holm, Michael
        Liu, Jinghao
        McLin, Nkenge
        Myrcha, Jacek
        Noriega, Fabricio
        Potra, Cristina
        Toyoshima, Tim
        16 total names in list

        Merge based on intersect:
        Bankov, Peter
        Holm, Michael
        Garcia, Hugo
        Beebe, Ann
        4 total names in list

        Concat based on partial name match "Garcia":
        Garcia, Debra
        Garcia, Hugo
        Garcia, Hugo
        3 total names in list
*/

Probíhá kompilace kódu

  • Vytvoření Visual Studio projektu, který se zaměřuje .NET Framework verze 3.5.Ve výchozím nastavení projektu odkazuje na System.Core.dll a using směrnice (C#) nebo Imports prohlášení (Visual Basic) pro obor názvů System.Linq.V jazyce C# projekty, přidejte using směrnice pro obor názvů System.IO.

  • Zkopírujte tento kód do projektu.

  • Stisknutím klávesy F5 sestavit a spustit program.

  • Stisknutím libovolné klávesy uzavřete okno konzoly.

Viz také

Koncepty

LINQ a řetězce

LINQ a souborové adresáře