Feedback

C# - String in einzelne Wörter aufteilen und Wörter zählen

Veröffentlicht von am 18.10.2010
(0 Bewertungen)
Hier im Forum gibt es bereits einige Einträge zu diesem Thema. Jedoch sind die Lösungen meistens „Nachbauten“ der .Net-Klassenmethode Strings.Split und somit auch mit deren Besonderheiten behaftet wie z.B. die benötigte Angabe eines „delimeters“ (Trennzeichens).

Einfacher und eleganter geht dies mittels einer „Extensions-Methode“, welche den übergebenen String in einzelne Wörter aufteilt. Mittels Implementierung als „Extensions-Methode“ kann man die Methode direkt auf jeden String anwenden.


public static class ExtendedStringMethods
{
public static MatchCollection SplitIntoWords(this string strToSplit)
{
return Regex.Matches( strToSplit, @"\w{1,}" );
}

public static string[] GetWordArray(this string strToSplit)
{
List<string> strWords = new List<string>();

foreach (Match word in Regex.Matches( strToSplit, @"\w{1,}" ))
strWords.Add( word.ToString() );

return strWords.ToArray();
}

public static int CountWords(this string strToCount)
{
return Regex.Matches( strToCount, @"\w{1,}" ).Count;
}
}


In der Beispielanwendung kann man einen String (hier der Text in einer TextBox) mit nur einem Methodenaufruf in einzelne Wörter aufteilen und eine ListBox damit füllen :


lbDemo.ItemsSource = tbDemo.Text.SplitIntoWords();


Falls als Rückgabewert ein String-Array benötigt wird, kann stattdessen die Methode „GetWordArray()“ aufgerufen werden :


lbDemo.ItemsSource = tbDemo.Text.GetWordArray();


Die Anzahl der Wörter in einem String (hier der Text in einer TextBox) erhält man mittels der Methode „CountWords()“ :


lblDemo.Content = tbDemo.Text.CountWords();


Screenshots der Beispielanwendung => http://twitpic.com/2ykf2k oder http://twitpic.com/2yllsb
C#-Code :

using System;
using System.Windows;
using System.Windows.Controls;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace FunctionLibraryTest1
{
  public partial class Window1 : Window
  {
    public Window1() { InitializeComponent(); }

    private void btnSplit_Click(object sender, RoutedEventArgs e)
    {
      lbDemo.ItemsSource = tbDemo.Text.SplitIntoWords();
      lblDemo.Content = tbDemo.Text.CountWords();
    }
  }

  public static class ExtendedStringMethods
  {
    public static MatchCollection SplitIntoWords(this string strToSplit)
    {
      return Regex.Matches( strToSplit, @"\w{1,}" );
    }

    public static string[] GetWordArray(this string strToSplit)
    { 
      List<string> strWords = new List<string>();

      foreach (Match word in Regex.Matches( strToSplit, @"\w{1,}" ))
        strWords.Add( word.ToString() );

      return strWords.ToArray();
    }

    public static int CountWords(this string strToCount)
    {
      return Regex.Matches( strToCount, @"\w{1,}" ).Count;
    }
  }
}


XAML-Code :

<Window x:Class="FunctionLibraryTest1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title=".Net-Snippets ExtendedStringMethods" Height="400" Width="300">

  <Window.Resources>
    <!-- **************************************************************************************** <-->
    <!-- ***************************** Hintergrund der ListViews ******************************** <-->
    <!-- **************************************************************************************** <-->
    <LinearGradientBrush x:Key="ListViewBackgroundDark" StartPoint="0,0" EndPoint="0,1">
      <GradientStop Offset="0" Color="Black"/>
      <GradientStop Offset="0.8" Color="DimGray"/>
      <GradientStop Offset="1" Color="DimGray"/>
    </LinearGradientBrush>
    <!-- **************************************************************************************** <-->
    <!-- **************************** Standard-Style für Buttons ******************************** <-->
    <!-- **************************************************************************************** <-->
    <Style x:Key="StandardButtonStyle" TargetType="Button">
      <Setter Property="Width" Value="100"/>
      <Setter Property="Height" Value="30"/>
      <Setter Property="Foreground" Value="White"/>
      <Setter Property="HorizontalAlignment" Value="Right"/>
      <Setter Property="VerticalAlignment" Value="Top"/>
    </Style>
    <!-- **************************************************************************************** <-->
    <!-- **************************** Template für schwarze Buttons ***************************** <-->
    <!-- **************************************************************************************** <-->
    <ControlTemplate x:Key="BlackButton" TargetType="{x:Type Button}">
      <Border BorderBrush="White" BorderThickness="1" CornerRadius="3">
        <Border BorderBrush="DarkGray" BorderThickness="1" CornerRadius="3">
          <Grid Name="ButtonGrid">
            <Rectangle Name="ButtonRect">
              <Rectangle.Fill>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <GradientStop Offset="0" Color="Gray" />
                  <GradientStop Offset="0.49" Color="DimGray" />
                  <GradientStop Offset="0.5" Color="DimGray" />
                  <GradientStop Offset="1" Color="Black" />
                </LinearGradientBrush>
              </Rectangle.Fill>
            </Rectangle>
            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Width="Auto" />
          </Grid>
        </Border>
      </Border>

      <ControlTemplate.Triggers>
        <!-- Bei Mausbewegung über den Button ... -->
        <Trigger Property="IsMouseOver" Value="True">
          <!-- Buttonhintergrund heller darstellen -->
          <Setter Property="Fill" TargetName="ButtonRect">
            <Setter.Value>
              <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                <GradientStop Offset="0" Color="Silver" />
                <GradientStop Offset="1" Color="Black" />
              </LinearGradientBrush>
            </Setter.Value>
          </Setter>
          <!-- Leuchteffekt -->
          <Setter Property="BitmapEffect">
            <Setter.Value>
              <OuterGlowBitmapEffect GlowColor="White" GlowSize="5" />
            </Setter.Value>
          </Setter>
        </Trigger>

        <Trigger Property="IsPressed" Value="True">
          <Setter Property="Fill" TargetName="ButtonRect" Value="#FF000000" />
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
  </Window.Resources>
  <Grid>
    <Grid.Background>
      <RadialGradientBrush GradientOrigin="0,0" Center="0.5,0.5" RadiusX="1.2" RadiusY="1.2">
        <RadialGradientBrush.GradientStops>
          <GradientStop Color="LightBlue" Offset="0" />
          <GradientStop Color="Black" Offset="0.8" />
          <GradientStop Color="Black" Offset="1" />
        </RadialGradientBrush.GradientStops>
      </RadialGradientBrush>
    </Grid.Background>
    <Grid.RowDefinitions>
      <RowDefinition Height="200" />
      <RowDefinition Height="100" />
      <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <ListBox x:Name="lbDemo" Grid.Row="0" Width="170" Height="172" Margin="0,15,0,0" FontSize="14"
             HorizontalAlignment="Center" VerticalAlignment="Top" Foreground="White"
             Background="{StaticResource ListViewBackgroundDark}"/>
    <Label x:Name="lblDemo" Grid.Row="0" Width="50" Margin="0,10,0,0" FontSize="14"
           Content="0" Foreground="White" HorizontalAlignment="Right" VerticalAlignment="Top"/>
    <TextBox x:Name="tbDemo" Grid.Row="1" Width="200" Height="75" Margin="0,10,0,0" FontSize="14"
             HorizontalAlignment="Center" VerticalAlignment="Top" VerticalScrollBarVisibility="Auto"
             TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" Foreground="White"
             Background="Black"/>
    <Button x:Name="btnSplit" Grid.Row="2" Width="180" Margin="0,0,0,20" 
            Content="Text in einzelne Wörter aufteilen" Click="btnSplit_Click"
            Style="{StaticResource StandardButtonStyle}" Template="{DynamicResource BlackButton}"
            HorizontalAlignment="Center" VerticalAlignment="Bottom" />
  </Grid>
</Window>

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!