Doberenz_gewinnus_ Arrays mit LINQ initialisieren5In dieser Blogserie möchten wir Ihnen eine kleine Auswahl aus den „Rezepten“ unserer neuen Titel Visual Basic 2015 und Visual C# 2015 präsentieren, und Ihnen als künftigen oder fortgeschrittenen VB- oder C#-Programmierer, einen Vorgeschmack darauf geben, wie Sie einzelne Komponenten für das Microsoft .NET Framework programmieren können.

Los gehts mit dem ersten Rezept, Arrays mit LINQ initialisieren:

Es kommt häufig vor, dass Sie die Elemente eines Arrays initialisieren müssen, entweder mit demselben Wert oder mit einer sich stetig erhöhenden Folge von Werten. Mittels LINQ können Sie all dies bereits im Array-Initialisierer erledigen – Sie brauchen dazu keine for-Schleife!

Die Klasse Enumerable aus dem Namespace System.Linq stellt dazu statische Methoden zum Ab­fragen von Objekten bereit, die System.Collection.Generic.IEnumerable<T> implementieren.

Als Beispiel werden in der folgenden Codezeile alle Elemente des Arrays a der Länge 10 mit dem Wert -1 initialisiert, die zweite Zeile initialisiert b mit (0,1,..9) und die dritte Zeile initialisiert c mit (100,110,…,190):

nt[] a = Enumerable.Repeat(-1, 10).ToArray();
int[] b = Enumerable.Range(0, 10).ToArray();
int[] c = Enumerable.Range(0, 10).Select(i => 100 + 10 * i).ToArray();

Oberfläche

Zum Testen öffnen Sie eine neue WPF-Anwendung und platzieren auf dem Stammelement (Grid) drei ListBoxen und drei Buttons (siehe Laufzeitabbildung).

...
<Grid Margin="0,0,2,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<DockPanel Grid.Column="0" Margin="20">
<Button Content="A" Click="Button_Click_1" DockPanel.Dock="Top" />
<ListBox Name="lbA" />
</DockPanel>
<DockPanel Grid.Column="1" Margin="20">
<Button Content="B" Click="Button_Click_2" DockPanel.Dock="Top" />
<ListBox Name="lbB" />
</DockPanel>
<DockPanel Grid.Column="2" Margin="20">
<Button Content="C" Click="Button_Click_3" DockPanel.Dock="Top" />
<ListBox Name="lbC" />
</DockPanel>
</Grid>
...

 

Weisen Sie im XAML-Code den drei ListBoxen eine Name-Eigenschaft (lbA, lbB, lbC) zu und erzeugen Sie (durch Doppelklick auf jeden der drei Buttons) drei Eventhandler.

Quellcode (MainWindow.xaml.cs)

Hier implementieren Sie die Interaktionslogik:

public partial class MainWindow : Window
{
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Alle Elemente des Arrays a mit dem Wert -1 initialisieren:
int[] a = Enumerable.Repeat(-1, 10).ToArray();
Anzeige:
for (int i = 0; i < 10; i++)
lbA.Items.Add(a[i].ToString());
}

private void Button_Click_2(object sender, RoutedEventArgs e)
{
Das Array b mit (0, 1, ...9) initialisieren:
int[] b = Enumerable.Range(0, 10).ToArray();
Anzeige:
for (int i = 0; i < 10; i++)
lbB.Items.Add(b[i].ToString());
}

private void Button_Click_3(object sender, RoutedEventArgs e)
{
Das Array c mit (100, 110,…, 190) initialisieren:
int[] c = Enumerable.Range(0, 10).Select(i => 100 + 10 * i).ToArray();
Anzeige:
for (int i = 0; i < c.Length; i++)
lbC.Items.Add(c[i].ToString());
}
}

Test

Abb. Arrays mit LINQ initialisieren aus dem Fachbuch Visual Basic 2015 von Walter Doberen und Thomas Gewinnus, Carl Hanser Verlag, München 2015

Abb. Arrays mit LINQ initialisieren aus dem Fachbuch Visual Basic 2015 von Walter Doberenz und Thomas Gewinnus, Carl Hanser Verlag, München 2015.

Bemerkungen

Vorsicht – wenn Sie große Arrays initialisieren, sollten Sie doch besser wieder die altmodische for-Schleife verwenden. Die LINQ-Lösung vergrößert das Array dynamisch, sodass der Garbage
Collector die Arrays zur Laufzeit einsammeln muss. Nutzen Sie deshalb die hier gezeigte Lösung vor allem bei kleineren Arrays oder innerhalb von Test- bzw. Debug-Code.

 

So, das war das erste Rezept, das sich in unserem Buch Visual Basic 2015 unter Kapitel 6.4.6 findet. Die Beispieldaten zum Herunterladen gibt es auf der Website der Autoren: www.doko-buch.de. In der nächsten Folge wird es darum gehen, wie Sie in Visual Basic Rechner für komplexe Zahlen programmieren.