2015-09-04 3 views
5

Ich mag ein String-Array filtern:Elemente in der Liste ändern mit ForEach Lambda

string[] args 

von der Kommandozeile, zB: "-command1 xy -command2 ab -command3 cd"

Unter Berücksichtigung all die Wörter mit einem '-' am Anfang, dann konvertieren diese in Großbuchstaben. Dies wird die args Liste mit Wörtern beginnend mit Rück

var commands = args.Where(x => x.StartsWith("-")).ToList<String>(); 
commands.ForEach(x => { 
    x.ToUpper() 
    }); 
commands.ToString(); 

‚-‘ Kleinbuchstaben - das ist die Lambda nicht angewendet werden. Warum ist das? Wird eine Kopie der Liste für die Lambda-Erfassung erstellt, und das ist geändert, nicht die Originalliste selbst?

+2

1. Sie setzen nicht 'x.ToUpper()' zu nichts. 2. Aber selbst wenn du es tust, würde es nicht kompilieren: Strings sind unveränderlich. Das solltest du tun: 'var commands = args.Where (x => x.StartsWith (" - ")). Wähle (x => x.ToUpper()). ToList();' – Rob

Antwort

5
var commands = args.Where(x => x.StartsWith("-")).Select(y => y.ToUpper()).ToList(); 

oder

var upperCommands = new List<String>(); 
var commands = args.Where(x => x.StartsWith("-")).ToList<String>(); 
    commands.ForEach(x => upperCommands.Add(
     x.ToUpper()); 
+3

Warum musstest du das überhaupt? Erwähnen Sie die zweite Option? Der erste ist viel einfacher und einfacher zu lesen. – ataravati

+1

@ataravati: Ich habe völlig zweitens, was Sie gesagt haben .. diese Erwähnung war nur für das Verständnis von OP. – DarkKnight

+0

es ist in Ordnung, ich habe die erste. Ich wusste nicht, dass es die Methode war, die ich verwenden sollte - ich habe die IntelliSense-Liste durchgesehen und aus irgendeinem Grund habe ich es mit dem Verhalten verwechselt, obwohl ich es nur benutzt habe! – Prof

Verwandte Themen