簡體   English   中英

字符串操作c#

[英]String manipulation c#

我有一個字符串, A:<<Default>>;B:<<Default>>;C:<<Default>>;D:<<Default>>;E:<<Default>> [template string]

字符串的表示形式類似於字典鍵:用分號分隔符分組為字符串的值。

現在應用邏輯后,我得到一個下面的字符串列表,

A:aaa;E:eee
D:ddd
B:bbb;E:eee

現在我需要將上面的列表作為下面的列表(其中具有新值的鍵應該以正確的順序放置並且其余鍵具有默認值),

A:aaa;B:<<Default>>;C:<<Default>>;D:<<Default>>;E:eee
A:<<Default>>;B:<<Default>>;C:<<Default>>;D:ddd;E:<<Default>>
A:<<Default>>;B:bbb;C:<<Default>>;D:<<Default>>;E:eee

嘗試使用拆分功能,替換並轉換為列表來實現此目的。 我們有任何有效的方法來實現同樣的目標嗎?

string constants = "A:<<Default>>;B:<<Default>>;C:<<Default>>;D:<<Default>>;E:<<Default>>";
            string placeHolder = string.Empty;


            List<string> filteredkeys = new List<string>();
            List<string> formattedKeys = new List<string>();
            filteredkeys.Add("A:aaa;E:eee;");
            filteredkeys.Add("D:ddd;");
            filteredkeys.Add("B:bbb;E:eee;");

            foreach (var item in filteredkeys)
            {
                placeHolder = constants;
                List<string> keyCombination = item.TrimEnd(';').Split(';').ToList();
                foreach (string keys in keyCombination)
                {
                    List<string> abc = keys.Split(':').ToList();
                    switch (abc[0])
                    {
                        case "A":
                            placeHolder = placeHolder.Replace("A:<<Default>>", keys);
                            break;
                        case "B":
                            placeHolder = placeHolder.Replace("B:<<Default>>", keys);
                            break;
                        case "C":
                            placeHolder = placeHolder.Replace("C:<<Default>>", keys);
                            break;
                        case "D":
                            placeHolder = placeHolder.Replace("D:<<Default>>", keys);
                            break;
                        case "E":
                            placeHolder = placeHolder.Replace("D:<<Default>>", keys);
                            break;
                    }                    
                }
                formattedKeys.Add(placeHolder);
            }

Linq解決方案:

  String source = @"A:<<Default>>;B:<<Default>>;C:<<Default>>;D:<<Default>>;E:<<Default>>";

  // Note, that "E" value (eee:fff:ggg:hhh) contains semicolons
  String values = "A:aaa;E:eee:fff:ggg:hhh";  

  var dict = values
    .Split(';')
    .Select(item => item.Split(new Char[] {':'}, 2)) // "2": if value contains ':'
    .ToDictionary(chunk => chunk[0], chunk => chunk[1]);

  String result = String.Join(";", source
    .Split(';')
    .Select(item => item.Split(':'))
    .Select(item => String.Join(":", 
       item[0],
       dict.ContainsKey(item[0]) ? dict[item[0]] : item[1])));

  // Test
  // A:aaa;B:<<Default>>;C:<<Default>>;D:<<Default>>;E:eee:fff:ggg:hhh
  Console.Write(result);

這是一個非常簡單的解決方案,只需解析字符串,然后將元素應用到您傳遞的字典中。 為了使用模板字符串,你簡單套用模板字符串,然后應用要處理如果合適覆蓋所有默認值的實際字符串:

public void ParseAndApply(Dictionary<string, string> dictionary, string text)
{
    foreach (string element in text.Split(';'))
    {
        string[] parts = element.Split(new char[]{ ':' }, 2);
        dictionary[parts[0]] = parts[1];
    }
}

public string ConvertToString(Dictionary<string, string> dictionary)
{
    return string.Join(";", dictionary.Select(kv => kv.Key + ":" + kv.Value));
}

像這樣使用:

string[] strings = { "A:aaa;E:eee", "D:ddd", "B:bbb;E:eee" };

foreach (string exampleString in strings)
{
    // create dictionary
    Dictionary<string, string> dict = new Dictionary<string, string>();

    // apply from template string
    string templateString = "A:<<Default>>;B:<<Default>>;C:<<Default>>;D:<<Default>>;E:<<Default>>";
    ParseAndApply(dict, templateString);

    // apply example string
    ParseAndApply(dict, exampleString);

    // write output
    Console.WriteLine(ConvertToString(dict));
}
A:aaa;B:<<Default>>;C:<<Default>>;D:<<Default>>;E:eee
A:<<Default>>;B:<<Default>>;C:<<Default>>;D:ddd;E:<<Default>>
A:<<Default>>;B:bbb;C:<<Default>>;D:<<Default>>;E:eee

錯過了這一點,當值為DataTime值時,值字符串可能包含字符':'

只要密鑰不包含冒號,這對於此解決方案來說就不是問題。 我們在ParseAndApply拆分元素的ParseAndApply ,我們只對其中的第一個冒號執行拆分一次,因此值后面出現的其他冒號不是問題。

這是通過單元測試,

[TestMethod]
public void Test()
{
    var template = "A:<<Default>>;B:<<Default>>;C:<<Default>>;D:<<Default>>;E:<<Default>>";

    Assert.AreEqual(Pair.Process("A:aaa;E:eee", template),
        "A:aaa;B:<<Default>>;C:<<Default>>;D:<<Default>>;E:eee");

    Assert.AreEqual(Pair.Process("D:ddd", template),
        "A:<<Default>>;B:<<Default>>;C:<<Default>>;D:ddd;E:<<Default>>");

    Assert.AreEqual(Pair.Process("B:bbb;E:eee", template),
        "A:<<Default>>;B:bbb;C:<<Default>>;D:<<Default>>;E:eee");

}

public class Pair
{
    public static char InnerSeperator = ':';
    public static char OuterSeperator = ';';
    public static string DefaultValue = "<<Default>>";

    public Pair(string asString)
    {
        var strings = asString.Split(InnerSeperator).ToList();
        Key = strings[0];
        Value = strings.Count > 1 ? strings[1] : DefaultValue;
    }

    public string Key { get; set; }
    public string Value { get; set; }
    public override string ToString()
    {
        return string.Format("{0}{1}{2}", Key, InnerSeperator, Value);
    }

    public static string ToStringJoined(IEnumerable<Pair> pairs)
    {
        return string.Join(OuterSeperator.ToString(), pairs.Select(i => i.ToString()));
    }

    public static IEnumerable<Pair> FromJoinedString(string joined)
    {
        return joined.Split(OuterSeperator)
            .Select(x => x.Trim())
            .Where(x => !string.IsNullOrWhiteSpace(x))
            .Select(x => new Pair(x));
    }

    public static string Process(string values, string template)
    {
        var templateItems = FromJoinedString(template);
        var valueItems = FromJoinedString(values);
        var resultItems = templateItems.Select(t => valueItems.FirstOrDefault(x => x.Key == t.Key) ?? t);
        return ToStringJoined(resultItems);
    }
}

為生活歡呼..

暫無
暫無

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

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