Feedback

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

Veröffentlicht von am 10/18/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!