Udostępnij za pośrednictwem


Porady: sortowanie lub filtrowanie danych tekstowych według dowolnego słowa lub pola (LINQ)

Poniższy przykład pokazuje, jak do sortowania wierszy tekstu strukturalne, takie jak wartości oddzielone przecinkami, przez dowolne pole w wierszu.To pole może określić dynamicznie w czasie wykonywania.Załóżmy, że pola w scores.csv reprezentuje numer identyfikacyjny Studenta, następuje seria cztery wyniki testów.

Aby utworzyć plik, który zawiera dane

Przykład

Class SortLines

    Shared Sub Main()
        Dim scores As String() = System.IO.File.ReadAllLines("../../../scores.csv")

        ' Change this to any value from 0 to 4 
        Dim sortField As Integer = 1

        Console.WriteLine("Sorted highest to lowest by field " & sortField)

        ' Demonstrates how to return query from a method. 
        ' The query is executed here. 
        For Each str As String In SortQuery(scores, sortField)
            Console.WriteLine(str)
        Next 

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

    End Sub 

    Shared Function SortQuery(
        ByVal source As IEnumerable(Of String), 
        ByVal num As Integer) As IEnumerable(Of String)

        Dim scoreQuery = From line In source 
                         Let fields = line.Split(New Char() {","}) 
                         Order By fields(num) Descending 
                         Select line

        Return scoreQuery
    End Function 
End Class 
' Output: 
' Sorted highest to lowest by field 1 
' 116, 99, 86, 90, 94 
' 120, 99, 82, 81, 79 
' 111, 97, 92, 81, 60 
' 114, 97, 89, 85, 82 
' 121, 96, 85, 91, 60 
' 122, 94, 92, 91, 91 
' 117, 93, 92, 80, 87 
' 118, 92, 90, 83, 78 
' 113, 88, 94, 65, 91 
' 112, 75, 84, 91, 39 
' 119, 68, 79, 88, 92 
' 115, 35, 72, 91, 70
public class SortLines
{
    static void Main()
    {
        // Create an IEnumerable data source 
        string[] scores = System.IO.File.ReadAllLines(@"../../../scores.csv");

        // Change this to any value from 0 to 4. 
        int sortField = 1;

        Console.WriteLine("Sorted highest to lowest by field [{0}]:", sortField);

        // Demonstrates how to return query from a method. 
        // The query is executed here. 
        foreach (string str in RunQuery(scores, sortField))
        {
            Console.WriteLine(str);
        }

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

    // Returns the query variable, not query results! 
    static IEnumerable<string> RunQuery(IEnumerable<string> source, int num)
    {
        // Split the string and sort on field[num] 
        var scoreQuery = from line in source
                         let fields = line.Split(',')
                         orderby fields[num] descending 
                         select line;

        return scoreQuery;
    }
}
/* Output (if sortField == 1):
   Sorted highest to lowest by field [1]:
    116, 99, 86, 90, 94
    120, 99, 82, 81, 79
    111, 97, 92, 81, 60
    114, 97, 89, 85, 82
    121, 96, 85, 91, 60
    122, 94, 92, 91, 91
    117, 93, 92, 80, 87
    118, 92, 90, 83, 78
    113, 88, 94, 65, 91
    112, 75, 84, 91, 39
    119, 68, 79, 88, 92
    115, 35, 72, 91, 70
 */

Ten przykład ilustruje też sposób zwrócić zmienna kwerendy z funkcji (Visual Basic) lub metody (C#).

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