Autor Beitrag
WildRover
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 02.12.16 10:40 
Hallo,

wie kann ich aus einem String-Array mehrere einzelne Elements auf einmal ansprechen?

Zur Erläuterung: Ich habe ein eindimensionales String-Array bekannter Größe, das sich auch nicht mehr ändert. Nun möchte ich, je nach Situation, mehrere Elemente mir anzeigen lassen. Welche Elemente das sind, möchte ich in mehreren fixen int-Arrays definieren, deren Elemente dann jeweils die Indizes des String-Arrays darstellen.

Ich stelle mir eine Funktion vor, der ich als Parameter das int-Array übergebe. Die Funktion ermittelt dann die gewünschten Elemente des String-Arrays über die Indizes aus dem int-Array und verarbeitet diese weiter.

Wie kann ich das prinzipiell realisieren? Ein einzelnes Element ermitteln ist natürlich kein Problem, alle Elemente ebenso. Aber mehrere ständig wechselnde Elemente? Mir würde das generelle Vorgehen genügen, den Code dazu möchte ich selber austüfteln.

Vielen Dank schonmal.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 02.12.16 10:50 
Du könntest eine Methode mit Rückgabetyp IEnumerable<string> erzeugen, und im Code dann per yield return die Werte zurückgeben - kannst dich an der Linq-Methode Where orientieren.

Für diesen Beitrag haben gedankt: WildRover
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Fr 02.12.16 16:32 
Hier ein kleines Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public IEnumerable<int> GetNumbers()
{
    yield return 5;
    yield return 10;
    yield return 15;
}

Wenn ich dann schreibe:
ausblenden C#-Quelltext
1:
2:
foreach (var item in GetNumbers())
    Console.WriteLine(item);

Bekomme ich dieses Ergebnis:
Zitat:
5
10
15


Hier noch die Doku von Microsoft dazu:
yield (C#-Referenz)

Für diesen Beitrag haben gedankt: WildRover
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 02.12.16 16:54 
Das generelle vorgehen beschreiben ist schwer. Ich häge mal eine Lösung an. Vielleicht ist rausfinden wie und warum das funktioniert schon tüfteln genug.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
class Program
{
    static string[] values = { "null""eins""zwei""drei""vier""fünf" };
    static int[] index1 = { 25 };
    static int[] index2 = { 1245 };


    static void Main(string[] args)
    {
        var result1 = GetFilteredArray(values, index1);
        var result2 = GetFilteredArray(values, index2);

        Console.WriteLine(string.Join(",", result1));
        Console.WriteLine(string.Join(",", result2));
    }

    static T[] GetFilteredArray<T>(T[] array, int[] indexes)
    {
        return array.Select((value, index) => new { index, value }).Where(x => indexes.Contains(x.index)).Select(x => x.value).ToArray();
    }
}

Für diesen Beitrag haben gedankt: WildRover
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 02.12.16 17:27 
Hallo Ralf,

die Performanz ist aber nicht so toll (O(n^2)).

Für diesen Beitrag haben gedankt: WildRover
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 02.12.16 17:42 
Der triviale Ansatz hat sicher Grenzen. Wenn das hier riesige Datenmengen sind würde ich aber auch bezweifeln das das jemand in fixen Arrays halten will oder sollte ;)

Edit : aber es gibt natürlich eine noch trivialere Lösung die keine quadratische Zugriffszeit hat. Wohl zu kompliziert gedacht ;)

ausblenden C#-Quelltext
1:
2:
3:
4:
static T[] GetFilteresArray<T>(T[] array, int[] indexes)
{
    return indexes.Select(x => array[x]).ToArray();
}

Für diesen Beitrag haben gedankt: WildRover
WildRover Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 05.12.16 12:55 
Hallo,

mit dem Ansatz von Ralf funktioniert es erstmal genauso wie gewünscht. Vielen Dank für eure Vorschläge. Jetzt muss ich mich durchwursteln, was der Code da so alles treibt.