Czy istnieje sposób formatowania ciągu według nazwy zamiast pozycji w C #?
W Pythonie mogę zrobić coś takiego jak ten przykład (bezwstydnie skradziony stąd ):
>>> print '%(language)s has %(#)03d quote types.' % \
{'language': "Python", "#": 2}
Python has 002 quote types.
Czy jest jakiś sposób, aby to zrobić w C #? Powiedz na przykład:
String.Format("{some_variable}: {some_other_variable}", ...);
Przydałaby się możliwość zrobienia tego przy użyciu nazwy zmiennej, ale słownik też jest akceptowalny.
c#
.net-3.5
string-formatting
Jason Baker
źródło
źródło
Odpowiedzi:
Nie ma wbudowanej metody obsługi tego problemu.
Oto jedna metoda
Oto kolejny
Trzecia ulepszona metoda częściowo oparta na dwóch powyższych , autorstwa Phila Haacka
źródło
Mam implementację, którą właśnie opublikowałem na moim blogu tutaj: http://haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing-and-edge-cases.aspx
Rozwiązuje pewne problemy, które mają te inne implementacje z ucieczką nawiasów klamrowych. Post zawiera szczegóły. Robi też coś DataBinder.Eval, ale nadal jest bardzo szybki.
źródło
Ciągi interpolowane zostały dodane do C # 6,0 i Visual Basic 14
Oba zostały wprowadzone za pomocą nowego kompilatora Roslyn w programie Visual Studio 2015 .
C # 6.0:
return "\{someVariable} and also \{someOtherVariable}"
LUBreturn $"{someVariable} and also {someOtherVariable}"
źródło: co nowego w C # 6.0
VB 14:
return $"{someVariable} and also {someOtherVariable}"
Godne uwagi funkcje (w Visual Studio 2015 IDE):
{index}
działa, ale także{(index + 1).ToString().Trim()}
Cieszyć się! (i kliknij „Wyślij uśmiech” w VS)
źródło
Możesz także użyć anonimowych typów, takich jak ten:
Oczywiście wymagałoby to więcej kodu, jeśli chcesz również przeanalizować formatowanie, ale możesz sformatować ciąg przy użyciu tej funkcji, takiej jak:
źródło
Wydaje się, że nie ma sposobu, aby to zrobić po wyjęciu z pudełka. Chociaż wydaje się, że możliwe jest zaimplementowanie własnej,
IFormatProvider
która łączy sięIDictionary
z wartościami for.Wyjścia:
Zastrzeżenie polega na tym, że nie można ich mieszać
FormatProviders
, więc fantazyjne formatowanie tekstu nie może być używane jednocześnie.źródło
Sam framework nie zapewnia sposobu, aby to zrobić, ale możesz spojrzeć na ten post Scotta Hanselmana. Przykładowe użycie:
Ten kod Jamesa Newtona-Kinga jest podobny i działa z właściwościami podrzędnymi i indeksami,
Kod Jamesa opiera się na System.Web.UI.DataBinder do parsowania ciągu i wymaga odwołania do System.Web, czego niektórzy ludzie nie lubią robić w aplikacjach innych niż internetowe.
EDYCJA: Aha i dobrze działają z typami anonimowymi, jeśli nie masz obiektu z gotowymi właściwościami:
źródło
Widzieć /programming/271398?page=2#358259
Z połączonym rozszerzeniem możesz napisać to:
a otrzymasz
"foo 2 System.Object
”.źródło
Myślę, że najbliższy, jaki otrzymasz, to indeksowany format:
Jest też String.Replace (), jeśli chcesz to zrobić w wielu krokach i wierzyć, że nie znajdziesz swoich `` zmiennych '' nigdzie indziej w ciągu:
Rozwiń to, aby użyć listy:
Możesz to zrobić również za pomocą Dictionary <string, string>, iterując jego kolekcje .Keys, ale używając List <KeyValuePair <string, string >> możemy skorzystać z metody .ForEach () listy i skondensować ją z powrotem do jednowierszowy:
Lambda byłaby jeszcze prostsza, ale nadal korzystam z .Net 2.0. Należy również zauważyć, że wydajność .Replace () nie jest znakomita, gdy jest używana iteracyjnie, ponieważ ciągi znaków w .Net są niezmienne. Wymaga to
MyString
również zdefiniowania zmiennej w taki sposób, aby była dostępna dla delegata, więc nie jest jeszcze doskonała.źródło
Moja biblioteka Open Source, Regextra , obsługuje między innymi nazwane formatowanie. Obecnie jest przeznaczony dla platformy .NET 4.0+ i jest dostępny w NuGet . Mam również wprowadzający wpis na blogu na ten temat: Regextra: pomagam zmniejszyć (problemy) {2} .
Nazwany bit formatowania obsługuje:
Przykład:
Wynik:
Sprawdź łącze GitHub projektu (powyżej) i wiki, aby uzyskać inne przykłady.
źródło
Sprawdź ten:
Próba:
Wydajność jest całkiem dobra w porównaniu z innymi rozwiązaniami.
źródło
Wątpię, żeby to było możliwe. Pierwszą rzeczą, która przychodzi na myśl, jest to, w jaki sposób zamierzasz uzyskać dostęp do lokalnych nazw zmiennych?
Jednak może istnieć sprytny sposób wykorzystania wyrażeń LINQ i Lambda, aby to zrobić.
źródło
Oto jeden, który zrobiłem jakiś czas temu. Rozszerza String o metodę Format pobierającą pojedynczy argument. Fajną rzeczą jest to, że użyje standardowego string.Format, jeśli podasz prosty argument, taki jak int, ale jeśli użyjesz czegoś takiego jak typ anonimowy, to też zadziała.
Przykładowe użycie:
Powoduje to „Rodzina Smithów ma czworo dzieci”.
Nie robi szalonych rzeczy wiążących, takich jak tablice i indeksatory. Ale to jest super proste i wydajne.
źródło
Przykład:
Wynik: 你好, wayjet, 今天 是 2011-05-04, 这 是 你 第 18 次 登录 , 积分 {100.40}
źródło
oto prosta metoda dla dowolnego obiektu:
A oto jak z niego korzystać:
wyjście: 27.02.2012
źródło
Zaimplementowałem to jest prostą klasą, która powiela funkcjonalność String.Format (z wyjątkiem sytuacji, gdy używam klas). Aby zdefiniować pola, możesz użyć słownika lub typu.
https://github.com/SergueiFedorov/NamedFormatString
C # 6.0 dodaje tę funkcjonalność bezpośrednio do specyfikacji języka, więc
NamedFormatString
jest to zgodne z poprzednimi wersjami.źródło
Rozwiązałem to w nieco inny sposób niż dotychczasowe rozwiązania. Zajmuje się rdzeniem wymienionego elementu (a nie fragmentem odbicia, który niektórzy zrobili). Jest to niezwykle szybkie i proste ... Oto moje rozwiązanie:
Jest używany w następujący sposób:
Mam nadzieję, że ktoś uzna to za przydatne!
źródło
Mimo że zaakceptowana odpowiedź zawiera kilka dobrych przykładów, .Inject, jak również niektóre przykłady Haacka nie obsługują ucieczki. Wiele z nich również w dużym stopniu polega na Regex (wolniej) lub DataBinder.Eval, które nie są dostępne w .NET Core oraz w niektórych innych środowiskach.
Mając to na uwadze, napisałem prosty parser oparty na maszynie stanów, który przesyła strumieniowo przez znaki, pisząc na
StringBuilder
wyjście, znak po znaku. Jest implementowany jakoString
metoda (y) rozszerzenia i może przyjmować zarówno plik, jakDictionary<string, object>
iobject
jako dane wejściowe parametry parametry (przy użyciu odbicia).Obsługuje nieograniczone poziomy
{{{escaping}}}
i wyrzuca,FormatException
gdy dane wejściowe zawierają niezrównoważone nawiasy klamrowe i / lub inne błędy.Ostatecznie cała logika sprowadza się do 10 głównych stanów - bo kiedy automat stanów znajduje się poza nawiasem, a także wewnątrz nawiasu, następny znak jest albo otwartym nawiasem, uciekającym otwartym nawiasem, zamkniętym nawiasem, uciekającym zamkniętym nawiasem, lub zwykła postać. Każdy z tych warunków jest obsługiwany indywidualnie w miarę postępu pętli, dodając znaki do wyjścia
StringBuffer
lub kluczaStringBuffer
. Gdy parametr jest zamknięty, wartość kluczaStringBuffer
jest używana do wyszukania wartości parametru w słowniku, która następnie jest umieszczana na wyjściuStringBuffer
. Na koniec zwracana jest wartość wyjściaStringBuffer
.źródło
Edycja: Powinienem był powiedzieć: „Nie, nie wierzę, że to, co chcesz zrobić, jest obsługiwane przez C #. To jest tak bliskie, jak zamierzasz”.
źródło
"someString" + someVariable + "someOtherString"
bardziej czytelną. Ten artykuł zgadza się z tobą.