簡體   English   中英

用 C# 中的字典格式化字符串

[英]Format string with dictionary in C#

假設我在Python中有以下代碼(是的,這個問題是關於 c# 這只是一個例子)

string = "{entry1} {entry2} this is a string"
dictionary = {"entry1": "foo", "entry2": "bar"}

print(string.format(**dictionary))

# output is "foo bar this is just a string"

在此字符串中,它將使用.format()將字符串中的 {entry1} 和 {entry2} 替換為 foo 和 bar

無論如何我可以在 C# 中復制這個完全相同的東西(並刪除花括號),如下面的代碼:

string str1 = "{entry1} {entry2} this a string";
Dictionary<string, string> dict1 = new() {
    {"entry1", "foo"},
    {"entry2", "bar"}
};

// how would I format this string using the given dict and get the same output?

使用字符串插值,您可以執行以下操作

    Dictionary<string, string> dict1 = new() {
    {"entry1", "foo"},
    {"entry2", "bar"}
    };
    string result = $"{dict1["entry1"]} {dict1["entry2"]} this is a string";

您可以借助正則表達式替換{...}中的值:

  using System.Text.RegularExpressions;

  ...

  string str1 = "{entry1} {entry2} this a string";

  Dictionary<string, string> dict1 = new() {
    { "entry1", "foo" },
    { "entry2", "bar" }
  };

  string result = Regex.Replace(str1, @"{([^}]+)}", 
      m => dict1.TryGetValue(m.Groups[1].Value, out var v) ? v : "???");

  // Let's have a look:
  Console.Write(result);

結果:

  foo bar this a string

您可以為字典編寫擴展方法,並根據需要在其中操作字符串

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;


public static class DictionaryExtensions
{
    public static string ReplaceKeyInString(this Dictionary<string, string> dictionary, string inputString)
    {

        var regex = new Regex("{(.*?)}");
        var matches = regex.Matches(inputString);
        foreach (Match match in matches)
        {
            var valueWithoutBrackets = match.Groups[1].Value;
            var valueWithBrackets = match.Value;

            if(dictionary.ContainsKey(valueWithoutBrackets))
                inputString = inputString.Replace(valueWithBrackets, dictionary[valueWithoutBrackets]);
        }

        return inputString;
    }
}

現在使用這個擴展方法將給定的字符串轉換為預期的字符串,

string input = "{entry1} {entry2} this is a string";
Dictionary<string, string> dictionary = new Dictionary<string, string> 
{ 
  { "entry1", "foo" }, 
  { "entry2", "bar" } 
};

var result = dictionary.ReplaceKeyInString(input);
Console.WriteLine(result);

RegEx 邏輯學分歸功於@Fabian Bigler 這是法比安的回答:

獲取花括號 c# 之間的值


在線嘗試

嘗試這個

foreach (var d in dict) str1=str1.Replace("{"+d.Key+"}",d.Value);

或者如果你喜歡擴展

    Console.WriteLine(str1.FormatFromDictionary(dict));
    
public  static string FormatFromDictionary(this string str, Dictionary<string, string> dict)
{
        foreach (var d in dict) str = str.Replace("{" + d.Key + "}", d.Value);
        return str;
}

如果一個字符串中有可能要替換的項目,您可以使用字符串生成器

public  static string FormatFromDictionary(this string str, Dictionary<string, string> dict)
{
        StringBuilder sb = new StringBuilder(str, 100);
        foreach (var d in dict) sb.Replace("{" + d.Key + "}", d.Value);
        return sb.ToString();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM