2009-09-15 16 views
6

To naprawdę denerwujące, jak C# wydaje się zmuszać użytkownika do jawnego nadawania indeksu każdemu parametrowi w String.Format, jeśli chcesz dodać kolejny parametr, musisz albo ponownie zindeksować ciąg znaków, albo go umieścić. twój nowy parametr na końcu.String.Format irytujące kolejność parametrów

Czy istnieje sposób, aby uzyskać C#, aby to zrobić automatycznie?

np. (Wiem, że to nie ma sensu pedanci, to tylko przykład :)

zacznę:

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

jeśli chcę dodać parametr na początku mogę wykonać jedną z następujących czynności:

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) 

w Delphi na przykład mógłbym zrobić odpowiednik tego:

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

Czy obie linie w C# i delphi zwracają to samo? – Beatles1692

Odpowiedz

23

dobrze, nie ma nic w C# zrobić th jest automatycznie dla Ciebie. Zawsze możesz napisać własną metodę, ale szczerze mówiąc, byłoby to mniej czytelne. Jest o wiele więcej myślenia (IMO), aby zrozumieć, co robi ostatnia linia, niż poprzednia. Kiedy trafisz {2} masz psychicznie wycofać i zastąpić poprzedni element z {3} aby pominąć {2} itp

Osobiście preferuję kod, który trwa nieco dłużej, aby wpisać, ale jest jasne, do odczytania.

+7

+1: Zachowanie powinno zawsze przynosić jednorazowe oszczędności przy pierwszym pisaniu. – Richard

+5

+1 "Programy komputerowe powinny być zaprojektowane tak, aby ludzie mogli je czytać i przypadkiem są uruchamiani przez komputery" –

+0

Co powiedzielibyśmy na String.Format ("{a} {b} {b} {c} {d}", a, b, c , d)? Czy można to dodać w .NET 4.0? Może kompilator może pomóc. Lub nowy DLR? Prawdopodobnie czegoś tutaj brakuje, ale byłoby miło ... –

2

Funkcja, której szukasz, nie jest częścią architektury. Oto fajna metoda wyszukiwania, którą znalazłem, która dostarcza nazwane parametry C#. Myślę, że Marc Gravell opublikował to lub jeden z tych innych guru SO.

 static readonly Regex rePattern = new Regex(@"\{([^\}]+)\}", RegexOptions.Compiled); 


    /// <summary> 
    /// Shortcut for string.Format. Format string uses named parameters like {name}. 
    /// 
    /// Example: 
    /// string s = Format("{age} years old, last name is {name} ", new {age = 18, name = "Foo"}); 
    /// 
    /// </summary> 
    /// <param name="format"></param> 
    /// <param name="values"></param> 
    /// <returns></returns> 
    public static string FN<T>(this string pattern, T template) 
    { 
     Dictionary<string, string> cache = new Dictionary<string, string>(); 
     return rePattern.Replace(pattern, match => 
     { 
      string key = match.Groups[1].Value; 
      string value; 

      if (!cache.TryGetValue(key, out value)) 
      { 
       var prop = typeof(T).GetProperty(key); 
       if (prop == null) 
       { 
        throw new ArgumentException("Not found: " + key, "pattern"); 
       } 
       value = Convert.ToString(prop.GetValue(template, null)); 
       cache.Add(key, value); 
      } 
      return value; 
     }); 
    } 
+0

Ładne, ale mają duży wpływ na wydajność !! – ShloEmi

1

Mimo że C# nie może tego zrobić dla ciebie, narzędzie może pomóc tutaj.

Resharper na przykład ostrzega, jeśli masz więcej parametrów w ciągu niż po ciągu. Sprawdziłem, czy zmiana kolejności parametrów w Resharper jest obsługiwana, ale w tym przypadku nie jest (R # obsługuje zmianę sygnatury metody, ale to nie pomaga tutaj).

Spójrz na Code Rush z DevEx. To narzędzie najprawdopodobniej ma to, czego potrzebujesz.

1

Wiem, że to jest stare, zgadzam się z Jonem. Nawet z ciągiem o dużym formacie (zobacz przykładowy kod poniżej), wciąż zajmuje mi mniej niż 1 minutę, aby zmienić pozycje indeksu elementów, jeśli muszę coś dodać, a ja uważam, że jest łatwiejszy w utrzymaniu i czytelny, a następnie próbuje utworzyć metoda automatyzacji procesu. Problem z zautomatyzowaniem tego polega na tym, że kilka tygodni później próbuję spojrzeć na kod ... na pierwszy rzut oka nie można tego pojąć. Ponadto, gdy dobrze opanujesz Visual Studio i nauczysz się używać takich rzeczy jak tryb edycji bloku i inne zaawansowane funkcje, możesz być bardzo produktywny.

//----------------------------------------------------------------------------- 
// <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

W Visual Studio 2015 można bok krok ten problem przy użyciu Interpolated Strings (jego trick kompilatora, więc nie ma znaczenia, którą wersję .NET Framework ty docelowy).

Następnie kod wyglądać tak

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

myślę, że sprawia, że ​​kod jest bardziej czytelny i mniej podatne na błędy.

Powiązane problemy