How to: Query for Characters in a String (LINQ)

Because the String class implements the generic IEnumerable<T> interface, any string can be queried as a sequence of characters. However, this is not a common use of LINQ. For complex pattern matching operations, use the Regex class.

Example

The following example queries a string to determine the number of numeric digits it contains. Note that the query is "reused" after it is executed the first time. This is possible because the query itself does not store any actual results.

Class QueryAString

    Shared Sub Main()

        ' A string is an IEnumerable data source. 
        Dim aString As String = "ABCDE99F-J74-12-89A" 

        ' Select only those characters that are numbers 
        Dim stringQuery = From ch In aString _
                          Where Char.IsDigit(ch) _
                          Select ch
        ' Execute the query 
        For Each c As Char In stringQuery
            Console.Write(c & " ")
        Next 

        ' Call the Count method on the existing query. 
        Dim count As Integer = stringQuery.Count()
        Console.WriteLine(System.Environment.NewLine & "Count = " & count)

        ' Select all characters before the first '-' 
        Dim stringQuery2 = aString.TakeWhile(Function(c) c <> "-")

        ' Execute the second query 
        For Each ch In stringQuery2
            Console.Write(ch)
        Next

        Console.WriteLine(System.Environment.NewLine & "Press any key to exit")
        Console.ReadKey()
    End Sub 
End Class 
' Output: 
' 9 9 7 4 1 2 8 9  
' Count = 8 
' ABCDE99F
class QueryAString
{
    static void Main()
    {
        string aString = "ABCDE99F-J74-12-89A";

        // Select only those characters that are numbers
        IEnumerable<char> stringQuery =
          from ch in aString
          where Char.IsDigit(ch)
          select ch;

        // Execute the query 
        foreach (char c in stringQuery)
            Console.Write(c + " ");

        // Call the Count method on the existing query. 
        int count = stringQuery.Count();
        Console.WriteLine("Count = {0}", count);

        // Select all characters before the first '-'
        IEnumerable<char> stringQuery2 = aString.TakeWhile(c => c != '-');

        // Execute the second query 
        foreach (char c in stringQuery2)
            Console.Write(c);

        Console.WriteLine(System.Environment.NewLine + "Press any key to exit");
        Console.ReadKey();

    }
}
/* Output:
  Output: 9 9 7 4 1 2 8 9
  Count = 8
  ABCDE99F
*/

Compiling the Code

  • Create a Visual Studio project that targets the .NET Framework version 3.5. By default, the project has a reference to System.Core.dll and a using directive (C#) or Imports statement (Visual Basic) for the System.Linq namespace. In C# projects, add a using directive for the System.IO namespace.

  • Copy this code into your project.

  • Press F5 to compile and run the program.

  • Press any key to exit the console window.

See Also

Tasks

How to: Combine LINQ Queries with Regular Expressions

Concepts

LINQ and Strings