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>