2009-09-15 17 views
6

Es ist wirklich ärgerlich, wie C# scheint, dass Sie explizit den Index jedes Parameters in String.Format, wenn Sie einen anderen Parameter irgendwo hinzufügen möchten, müssen Sie entweder die Zeichenfolge neu indizieren oder setzen Ihr neuer Parameter am Ende.String.Format Parameter Reihenfolge Ärger

Gibt es eine Möglichkeit, C# automatisch dazu zu bringen?

z.B. (Ich weiß, das sinnlos Pedanten ist, es ist nur ein Beispiel :)

Ich beginne mit:

String.Format("{0} {1} {1} {2} {3}", a, b, c, d) 

wenn ich einen Parameter am Anfang hinzufügen Ich möchte eine der folgenden Möglichkeiten:

String.Format("{4} {0} {1} {1} {2} {3}", a, b, c, d, e) 
String.Format("{0} {1} {2} {2} {3} {4}", e, a, b, c, d) 

in Delphi zum Beispiel ich das Äquivalent dies tun könnte:

String.Format("{} {} {} {2} {} {}", e, a, b, c, d) 
+0

Sind beide Zeilen in C# und Delphi dasselbe? – Beatles1692

Antwort

23

Nun, es gibt nichts in C# zu tun th ist automatisch für dich. Du könntest immer deine eigene Methode schreiben, um es zu tun, aber offen gesagt würde ich es weniger lesbar finden. Es gibt viel mehr zu denken (IMO), um zu verstehen, was Ihre letzte Zeile als die vorherige tut. Wenn Sie die Hit {2} du hast mit {3} den vorherigen Artikel gedanklich wieder zu ansetzen und ersetzen die {2} usw.

überspringen

persönlich Code, den ich lieber die etwas länger dauert zu geben, aber es ist klar zu lesen.

+7

+1: Wartbarkeit sollte immer einmal Einsparungen beim ersten Schreiben gewinnen. – Richard

+5

+1 "Computerprogramme sollten für Menschen zum Lesen ausgelegt sein und werden übrigens von Computern ausgeführt" –

+0

Wie wäre es mit String.Format ("{a} {b} {b} {c} {d}", a, b, c , d)? Könnte dies in .NET 4.0 hinzugefügt werden? Vielleicht könnte Compiler helfen. Oder neues DLR? Ich verpasse hier wahrscheinlich etwas, aber es wäre nett ... –

2

Die von Ihnen angeforderte Funktion gehört nicht zum Framework. Hier ist eine nette Erweiterungsmethode, die ich gefunden habe, die benannte Parameter C# zur Verfügung stellt. Ich denke Marc Gravell hat es gepostet oder eines dieser anderen SO-Gurus.

+0

Schön, aber haben einen großen Einfluss auf die Leistung! – ShloEmi

1

Auch wenn C# dies nicht für Sie tun kann, könnte das Tool hier helfen.

Resharper zum Beispiel warnt Sie, wenn Sie mehr Parameter in der Zeichenfolge als nach der Zeichenfolge haben. Ich habe geschaut, ob das Umsortieren von Parametern in Resharper unterstützt wird, aber in diesem Fall ist dies nicht der Fall (R # unterstützt das Ändern der Methodensignatur, aber das hilft hier nicht).

Schauen Sie sich Code Rush von DevEx an. Dieses Tool hat sehr wahrscheinlich, was Sie brauchen.

1

Ich weiß, das ist alt, stimme ich Jon. Selbst mit einer großen Format-Zeichenfolge (siehe Codebeispiel unten) dauert es immer noch weniger als 1 Minute, um die Indexpositionen der Elemente wiederherzustellen, wenn ich etwas hinzufügen muss. Ich finde es wartbarer und lesbarer, als wenn ich versuche, ein Methode, um den Prozess zu automatisieren. Das Problem mit der Automatisierung ist, wenn ich versuche, den Code ein paar Wochen später zu betrachten. Sie können es nicht auf den ersten Blick herausfinden. Nachdem Sie Visual Studio gut gelernt und gelernt haben, Dinge wie den Blockbearbeitungsmodus und einige der anderen erweiterten Funktionen zu verwenden, können Sie sehr produktiv sein.

//----------------------------------------------------------------------------- 
// <copyright file="ShellForm.cs" company="DCOM Productions"> 
//  Copyright (c) DCOM Productions. All rights reserved. 
// </copyright> 
//----------------------------------------------------------------------------- 

string updateCommandText = string.Format("UPDATE `moh`.`moh` SET ageact = '{0}', branch = '{1}', cemetary = '{2}', citation = '{3}', citycement = '{4}', cdateact = '{5}', cdateaward = '{6}', cdatebirth = '{7}', cdatedeath = '{8}', namefirst = '{9}', namelast = '{10}', placeact = '{11}', placeenter = '{12}', presat = '{13}', presby = '{14}', rankact = '{15}', rankawd = '{16}', rankhigh = '{17}', synopsis = '{18}', unit = '{19}', war = '{20}', imgfile = '{21}' WHERE ID = '{22}'", 
    /* {0} */ uxAgeAct.Text.Replace("'", "''"), 
    /* {1} */ uxBranch.Text.Replace("'", "''"), 
    /* {2} */ uxCemetary.Text.Replace("'", "''"), 
    /* {3} */ uxCitation.Text.Replace("'", "''"), 
    /* {4} */ uxCityCemetary.Text.Replace("'", "''"), 
    /* {5} */ uxDateAct.Text.Replace("'", "''"), 
    /* {6} */ uxDateAward.Text.Replace("'", "''"), 
    /* {7} */ uxDateBirth.Text.Replace("'", "''"), 
    /* {8} */ uxDateDiceased.Text.Replace("'", "''"), 
    /* {9} */ uxNameFirst.Text.Replace("'", "''"), 
    /* {10} */ uxNameLast.Text.Replace("'", "''"), 
    /* {11} */ uxPlaceAct.Text.Replace("'", "''"), 
    /* {12} */ uxPlaceEnter.Text.Replace("'", "''"), 
    /* {13} */ uxPresentedAt.Text.Replace("'", "''"), 
    /* {14} */ uxPresentedBy.Text.Replace("'", "''"), 
    /* {15} */ uxRankAct.Text.Replace("'", "''"), 
    /* {16} */ uxRankAwarded.Text.Replace("'", "''"), 
    /* {17} */ uxRankHigh.Text.Replace("'", "''"), 
    /* {18} */ uxSynopsis.Text.Replace("'", "''"), 
    /* {19} */ uxUnit.Text.Replace("'", "''"), 
    /* {20} */ uxWar.Text.Replace("'", "''"), 
    /* {21} */ uxImgFile.Text.Replace("'", "''"), 
    /* {22} */ dataRow["ID"].ToString()); 
3

Ab Visual Studio 2015 können Sie dieses Problem Schritt Seite mit Interpolated Strings (es ist ein Compiler Trick, so spielt es keine Rolle, welche Version des .NET Framework Sie zielen).

Der Code sieht dann so etwas wie diese

string txt = $"{person.ForeName} is not at home {person.Something}"; 

ich denke, es der Code besser lesbar macht und weniger fehleranfällig.