2015-09-04 8 views
5

Chcę filtrować tablicę ciągów:Modyfikowanie elementów w liście z ForEach lambda

string[] args 

z wiersza poleceń, np: "-command1 xy -command2 ab -command3 cd"

uwzględnieniem wszystkich słowa z "-" na początku, a następnie przekształcanie ich na wielkie litery.

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

Spowoduje to wyświetlenie listy argumentów za pomocą słów rozpoczynających się od "-" małych liter - to znaczy, że lambda nie jest stosowana. Dlaczego to? Czy jest tworzona kopia listy do przechwytywania lambda, która jest modyfikowana, a nie sama lista źródeł?

+2

1. Nie jesteś ustawienie 'x.ToUpper()' do niczego. 2. Ale nawet gdybyś to zrobił, to by się nie skompilował: ciągi są niezmienne. Powinieneś to zrobić: 'var commands = args.Where (x => x.StartsWith (" - ")) Wybierz (x => x.ToUpper()). ToList();' – Rob

Odpowiedz

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

lub

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

Dlaczego nawet potrzebujesz wymienić drugą opcję? Ten pierwszy jest dużo prostszy i łatwiejszy do odczytania. – ataravati

+1

@ataravati: Całkowicie odrzuciłem to, co powiedziałeś .. ta wzmianka była po prostu dla zrozumienia PO. – DarkKnight

+0

W porządku, mam pierwszą. Nie zdawałem sobie sprawy, że wybrana metoda była użyta - spojrzałem w dół na listę intellisense iz jakiegoś powodu dostałem pomieszanie z jej zachowaniem, mimo że używam go! – Prof