2017-08-15 20 views
0

我有一個MyObj的靜態列表,它是從json文件動態填充的。C#列出輸入字符串的替換值 - 最快的方法

public class MyObj 
{ 
    public string OriginalValue { get; set; } = ""; 
    public string ReplacementValue { get; set; } = ""; 
} 

爲了解決這個問題,我將使用foo值填充列表。

public static List<MyObj> ReplacementValues = new MyObj[] 
{ 
    new MyObj() { OriginalValue = "{a}", ReplacementValue = "Queen" }, 
    new MyObj() { OriginalValue = "{m}", ReplacementValue = "Cersei" }, 
    new MyObj() { OriginalValue = "{s1}", ReplacementValue = "Khaleesi" }, 
    new MyObj() { OriginalValue = "{p}", ReplacementValue = "Harry" }, 
    ... 
    new MyObj() { OriginalValue = "{_2_29sa}", ReplacementValue = "229Z" } 
}.ToList(); 

然後我有一個輸入的字符串(可以是任何東西真的,同{X}值的倍數,30X倍):

var inputstring = "The Khal is looking for a {a}, her name must not be {m}. He found one called {s1}. {p} Potter {p}{p}{p}{p}{p}{p}";

以什麼方式我可以迅速通過迭代值,用替換值替換字符串中的值。

我可以做一個foreach循環與indexOf的等,並遍歷靜態列表,但列表可能會相當大,可以說15000條目大。我知道這聽起來不是很多,但替換應該接近實時,如果輸入字符串中有相同值的400倍,可能會通過15k列表循環很多次。

是否有更快的lambda或正則表達式快速替換字符串中的值與查找列表中的值?

+0

什麼[與string.replace()](https://msdn.microsoft.com/en-us/library/fk49wtc1( v = vs.110)的.aspx)?這將需要通過每個替代,但黨會很容易! – itsme86

+0

那麼循環一次大列表,併爲每個條目使用string.Replace? – Pierre

+3

考慮使用Dictionary (或Dictionary ,其中鍵是原始值(假設它們是唯一的)並且該值是替換字符串(或該鍵所屬的MyObj實例))。沒有必要迭代集合,而是可以使用:myDict [key] .Value(或myDict [key] .Value.ReplacementValue;) – CodexNZ

回答

2

我建議Regex.ReplaceMatchEvaluator代表是最好的選擇:

var dictReplacement = ReplacementValues.ToDictionary(rv => rv.OriginalValue, rv => rv.ReplacementValue); 

var ans = Regex.Replace(inputstring, @"\{.+?\}", m => dictReplacement.ContainsKey(m.Value) ? dictReplacement[m.Value] : m.Value); 

如果您有C#7.0,你可以用這個代替:

var ans = Regex.Replace(inputstring, @"\{.+?\}", m => dictReplacement.TryGetValue(m.Value, out var subst) ? subst : m.Value); 
0

我認爲最簡單的方法是使用String.Replaceforeach循環。

foreach(var r in ReplacementValues) 
{ 
     inputString.Replace(r.OriginalValue, r.ReplacementValue); 
} 

,或者你可以簡化這個(注意,這是低效率):

ReplacementValues.ForEach(r => inputList.Replace(r.OriginalValue, r.ReplacementValue); 
+0

你爲什麼說第二個效率較低?功能上完全一樣。 –

1

考慮到您的列表可能有這麼多不同的對象,我認爲最好是掃描您的更短的輸入字符串,然後替換您在其中找到的標籤。

你可以用字典的快速檢索時間結合本

Dictionary<string, string> test = new Dictionary<string, string>() 
{ 
    {"{a}", "the new hero"}, 
    {"{b}", "of the new era"} 
}; 
..... 

string input = GetInputString(); 
int posStart = 0; 
while ((posStart = input.IndexOf("{", posStart)) != -1) 
{ 
    int posEnd = replacements.IndexOf("}", posStart+1); 
    if(posEnd == -1) 
     break; 

    string sub = input.Substring(posStart, posEnd+1-posStart); 
    if(test.ContainsKey(sub)) 
     input = input.Replace(sub, test[sub]); 
    posStart++; 
} 
Console.WriteLine(input); 
相關問題