2009-06-26 8 views
2

Ich möchte die Spaltenüberschriften einer CSV-Datei zuschneiden, die Felder unten sind ein Array mit den Überschriften, wo würde ich trim() platzieren? Ich habe es mit der foreach-Schleife platziert, aber VS sagt mir, "kann Feld nicht zuweisen, weil es eine Foreach-Iterationsvariable ist". Was mache ich falsch?C# "kann kein Feld zuweisen, da es sich um eine Foreach-Iterationsvariable handelt"

while ((fields = csv.GetCSVLine()) != null) 
{ 
    if (header) 
    { 
     foreach (string field in fields) 
     { 
       //field = field.trim(); //VS: "cannot assign field because it is a foreach iteration variable" 
      headers.Add(field); 
     } 
} 

Antwort

9

Sie können es auf der gleichen Linie wie der Anruf Add() tun. Sie müssen die Variable field nicht überschreiben, wenn Sie das Ergebnis Trim() direkt an Add() übergeben.

foreach (string field in fields) 
{ 
    headers.Add(field.Trim()); 
} 
+0

Brilliant danke. –

8

Sie versuchen, den Wert des Elements, an dem Sie gerade arbeiten, zu ändern.

Just do

var trimmedField=field.Trim(); 
headers.Add(trimmedField); 
+6

Oder um übersichtlicher zu sein, könnten Sie headers.Add (field.Trim()); –

+0

Gleichermaßen sinnvoll, besonders wenn Sie die getrimmte Version nur einmal verwenden. – JasonTrue

3
foreach (string field in fields) 
    { 
     headers.Add(field.Trim()); 
    } 
3

Es scheint mir, dass der Compiler bereits genau gesagt, Sie hat, was Sie tun, ist falsch: Sie versuchen, etwas zu vergeben, die eine Iterationsvariable ist, die Sie offenbar nicht tun dürfen . Die anderen Antworten hier haben Ihnen gesagt, was Sie stattdessen tun können: entweder kopieren Sie die Iterationsvariable in eine andere Variable und schneiden Sie diese, oder überspringen Sie die Zuweisung insgesamt und fügen Sie den getrimmten Wert direkt hinzu.

+3

Um fair zu sein, die Compiler-Warnung ist wirklich nicht hilfreich, was Sie tun sollten, und die MSDN-Dokumente sind auch nicht spektakulär. Aber es macht eine gewisse Art von Sinn, sobald Sie anfangen zu verstehen, wie C# Werte und Referenztypen behandelt. – andersop

1

Obwohl das Aussehen wäre weniger ‚modern‘, seine wahrscheinlich etwa so schnell auszuführen und ressourcenfreundlich, einfach eine Für Schleife im beschriebenen Fall zu nutzen, das heißt:

while ((fields = csv.GetCSVLine()) != null) { 
    if (header) { 
     for(int ii = 0; ii < fields.Count; ii++) { 
      headers.Add(field); 
} } } 

Natürlich I Ich bin mir sicher, dass das Problem vor einigen Jahren gelöst wurde, aber ich mache es nur da draußen, um anderen beim Durchblättern zu helfen. Ich persönlich denke, dass es ein bisschen albern ist, dass wir foreach Iteratoren keine Werte zuweisen dürfen (ich vermute, dass sie die Hürde (so wie sie ist) zur Kompilier- und/oder Laufzeit leicht abdecken können).

Verwandte Themen