[C#] C #에서 명명 된 문자열 형식

C #에서 위치가 아닌 이름으로 문자열을 형식화하는 방법이 있습니까?

파이썬에서는이 예제와 같은 것을 할 수 있습니다. 여기 ).

>>> print '%(language)s has %(#)03d quote types.' % \
      {'language': "Python", "#": 2}
Python has 002 quote types.

C #에서 이것을 수행하는 방법이 있습니까? 예를 들어 :

String.Format("{some_variable}: {some_other_variable}", ...);

변수 이름을 사용 하여이 작업을 수행 할 수 있으면 좋지만 사전도 허용됩니다.



답변

이를 처리하기위한 기본 제공 방법이 없습니다.

한 가지 방법이 있습니다

string myString = "{foo} is {bar} and {yadi} is {yada}".Inject(o);

여기 또 다른

Status.Text = "{UserName} last logged in at {LastLoginDate}".FormatWith(user);

Phil Haack에서 위의 두 가지를 부분적으로 기반으로하는 세 번째 개선 된 방법


답변

방금 블로그에 게시 한 구현이 있습니다. http://haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing-and-edge-cases.aspx

중괄호 이스케이프와 관련된 다른 구현에서 발생하는 몇 가지 문제를 해결합니다. 게시물에 세부 정보가 있습니다. DataBinder.Eval도 수행하지만 여전히 매우 빠릅니다.


답변

보간 된 문자열 이 C # 6.0 및 Visual Basic 14에 추가되었습니다.

둘 다 Visual Studio 2015 에서 새로운 Roslyn 컴파일러를 통해 소개되었습니다 .

  • C # 6.0 :

    return "\{someVariable} and also \{someOtherVariable}" 또는
    return $"{someVariable} and also {someOtherVariable}"

  • VB 14 :

    return $"{someVariable} and also {someOtherVariable}"

주목할만한 기능 (Visual Studio 2015 IDE) :

  • 구문 색상 이 지원됩니다-문자열에 포함 된 변수가 강조 표시됩니다
  • 리팩토링 지원-이름을 바꾸면 문자열에 포함 된 변수의 이름도 바뀝니다.
  • 실제로 변수 이름뿐만 아니라 표현식 도 지원됩니다. 예 : {index}작동 할뿐만 아니라{(index + 1).ToString().Trim()}

즐겨! (VS에서 “웃음 보내기”를 클릭하십시오)


답변

다음과 같이 익명 유형을 사용할 수도 있습니다.

    public string Format(string input, object p)
    {
        foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(p))
            input = input.Replace("{" + prop.Name + "}", (prop.GetValue(p) ?? "(null)").ToString());

        return input;
    }

물론 형식화를 구문 분석하려면 더 많은 코드가 필요하지만 다음과 같이이 함수를 사용하여 문자열의 형식을 지정할 수 있습니다.

Format("test {first} and {another}", new { first = "something", another = "something else" })


답변

이 작업을 즉시 수행 할 수있는 방법이없는 것 같습니다. 그러나 for 값에 IFormatProvider연결되는 자체 구현을 구현하는 것이 가능해 보입니다 IDictionary.

var Stuff = new Dictionary<string, object> {
   { "language", "Python" },
   { "#", 2 }
};
var Formatter = new DictionaryFormatProvider();

// Interpret {0:x} where {0}=IDictionary and "x" is hash key
Console.WriteLine string.Format(Formatter, "{0:language} has {0:#} quote types", Stuff);

출력 :

파이썬에는 2 개의 따옴표 유형이 있습니다

주의 할 점은 혼합 할 수 없으므로 FormatProviders멋진 텍스트 형식을 동시에 사용할 수 없다는 것입니다.


답변

프레임 워크 자체는이를 수행하는 방법을 제공하지 않지만 Scott Hanselman 의이 게시물 을 살펴볼 수 있습니다 . 사용법 예 :

Person p = new Person();
string foo = p.ToString("{Money:C} {LastName}, {ScottName} {BirthDate}");
Assert.AreEqual("$3.43 Hanselman, {ScottName} 1/22/1974 12:00:00 AM", foo); 

James Newton-King 의이 코드 는 유사하며 하위 속성 및 색인과 작동합니다.

string foo = "Top result for {Name} was {Results[0].Name}".FormatWith(student));

James의 코드는 System.Web.UI.DataBinder에 의존합니다. 문자열을 구문 분석하고 어떤 사람들은 비 – 웹 애플리케이션에서 수행하는 좋아하지 않아 System.Web을 참조 할 필요합니다.

편집 : 아, 속성이 준비된 객체가 없다면 익명 유형과 잘 작동합니다.

string name = ...;
DateTime date = ...;
string foo = "{Name} - {Birthday}".FormatWith(new { Name = name, Birthday = date });


답변

보다 /programming/271398?page=2#358259를 하십시오.

링크 된 확장을 사용하면 다음과 같이 작성할 수 있습니다.

var str = "{foo} {bar} {baz}".Format(foo=>"foo", bar=>2, baz=>new object());

그리고 당신은 "foo 2 System.Object“를 얻을 것이다 .