Array nach Namen analysieren

jimboo

Mitglied
Hi,

ich habe folgenden Array bspw.:

Dim arrayTexte As Array
arrayTexte(1) = "Peter"
arrayTexte(2) = "Harry"
arrayTexte(3) = "Sabine"
arrayTexte(4) = "Sabine"
arrayTexte(5) = "Jörg"
arrayTexte(6) = "Harry"
arrayTexte(7) = "Harry"


Im Folgenden soll nun überprüft werden wie viele Personen es überhaupt gibt, in diesem Fall 4!
Anschließend sollen die Anzahl der Namen ermittelt werden, z.B.:
Peter: #1
Harry: #3
Sabine: #2
Jörg: #1

Bitte um schnelle Hilfe!
 
Ich hab es verschoben, denn mit Web hat das nun mal nichts zu tun.

Hier VB Code (Achtung, via Reflector generiert, unterhalb gibt es noch das C# Original):

Code:
Public Class NameCounterList
    Inherits List(Of String)
    ' Methods
    Public Sub Add(ByVal item As String)
        MyBase.Add(item)
        If Me._names.ContainsKey(item.ToLower) Then
            Dim CS$0$0000 As Dictionary(Of String, Integer)
            Dim CS$0$0001 As String
            CS$0$0000 = Me._names.Item(CS$0$0001 = item.ToLower) = (CS$0$0000.Item(CS$0$0001) + 1)
        Else
            Me._names.Add(item.ToLower, 1)
        End If
    End Sub

    Public Sub Clear()
        MyBase.Clear
        Me._names.Clear
    End Sub

    Public Overrides Function ToString() As String
        Dim sb As New StringBuilder
        If (Me._names.Count > 0) Then
            Dim en As Enumerator(Of String, Integer) = Me._names.GetEnumerator
            Do While en.MoveNext
                sb.Append(en.Current.Key)
                sb.Append(": ")
                sb.Append(en.Current.Value.ToString)
                sb.Append(Environment.NewLine)
            Loop
        End If
        Return sb.ToString
    End Function


    ' Fields
    Private _names As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer)
End Class
Und hier der Aufruf:
Code:
Dim ncl As New NameCounterList
ncl.Add("Peter")
ncl.Add("Harry")
ncl.Add("Sabine")
ncl.Add("Sabine")
ncl.Add("J" & ChrW(246) & "rg")
ncl.Add("Harry")
ncl.Add("Harry")
Console.WriteLine(ncl.ToString)
Und damit erhälst du folgenden Output:
Code:
peter: 1
harry: 3
sabine: 2
jörg: 1
Und wer das Original in C# braucht, hier bitte zuerst die Klasse:
C#:
public class NameCounterList : List<string>
{
    private Dictionary<string, int> _names = new Dictionary<string, int>();

    public new void Add(string item)
    {
        base.Add(item);

        if (_names.ContainsKey(item.ToLower()))
            _names[item.ToLower()]++;
        else
            _names.Add(item.ToLower(), 1);
    }

    public new void Clear()
    {
        base.Clear();
        _names.Clear();
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        if (this._names.Count > 0)
        {
            Dictionary<string, int>.Enumerator en = this._names.GetEnumerator();
            while (en.MoveNext())
            {
                sb.Append(en.Current.Key);
                sb.Append(": ");
                sb.Append(en.Current.Value.ToString());
                sb.Append(System.Environment.NewLine);
            }
        }
        return sb.ToString();
    }
}
Und hier nun der entsprechende Aufruf:
C#:
NameCounterList ncl = new NameCounterList();
ncl.Add("Peter");
ncl.Add("Harry");
ncl.Add("Sabine");
ncl.Add("Sabine");
ncl.Add("Jörg");
ncl.Add("Harry");
ncl.Add("Harry");
Console.WriteLine(ncl.ToString());
Output ist natürlich derselbe.
 
Danke für die Mühe. Allerdings erscheint mir deine Lösung etwas umständlich. Ich habe das nun mit einer Hashtable gelöst.
Trotzdem danke.
 
Das via eine HashTable abzubilden ist nicht weniger Code :) Vermutlich hast du dich auch davon irritieren lassen, dass der Code in zwei Sprachen (VB.NET und C#) gepostet wurde.

Auf jeden Fall ist meine Variante gekapselt und besitzt den Vorteil, dass auch der Verlauf der hinzugefügten Werte ersichtlich ist. Und nicht nur die aufsummierten Werte.
 
Zurück