2013-08-30 38 views
1
string originaltext = "A man meet a man"; 
string spintext ="A {man|Person} meet a {man|male}"; 

每個原文可以有一些旋轉的選擇,所以每個字開始索引指向旋轉選項字...如何通過索引在c#中動態地映射字符串?

例如:「{|人的人}」 的「人」有spinoption首次出現.. 的「人」第二次數有spinoption「{人|男性}」 ......

如果原文改變,那麼所有字索引改變...... 所以,我想點新的索引...

public Dictionary<int, SpintaxMappedValue> SpintaxListDict 
{ 
    get 
    { 
     return _spintaxListDict; 
    } 
    set 
    { 
     _spintaxListDict = value; 
    } 
} 

internal static void AlterSpintaxList(string _NeworiginalText) 
{ 
    //Build new dictionary for current text 
    var _NeworiginalTextDict = Regex.Matches(_NeworiginalText, @"\b\w+\b").Cast<Match>().ToDictionary(m => m.Index, m => m.Value); 

    //Comparing old original value dict with new original value dict 
    bool dictionariesEqual = 
     _NeworiginalTextDict.Keys.Count == Init.SpintaxEditorPropertyMain.OriginalTextDict.Keys.Count && 
     _NeworiginalTextDict.Keys.All(k => Init.SpintaxEditorPropertyMain.OriginalTextDict.ContainsKey(k) && 
     object.Equals(Init.SpintaxEditorPropertyMain.OriginalTextDict[k], _NeworiginalTextDict[k])); 

    //do mapping if dictionaries are not Equal 
    if (dictionariesEqual == false) 
    { 
     Dictionary<int, SpintaxMappedValue> TempSpintaxDict = new Dictionary<int, SpintaxMappedValue>(Init.SpintaxEditorPropertyMain.SpintaxListDict); 
     Dictionary<int, SpintaxMappedValue> NewSpintaxListDict = new Dictionary<int, SpintaxMappedValue>(); 

     foreach (KeyValuePair<int, SpintaxMappedValue> olditem in TempSpintaxDict) 
     { 
      foreach (KeyValuePair<int, string> newitem in _NeworiginalTextDict) 
      { 
       if (olditem.Key != newitem.Key) 
       { 
        if (olditem.Value.OriginalWord == newitem.Value) 
        { 
         //if (newitem.Key > olditem.Key) 
         //{ 
         olditem.Value.OriginalWordStartingPosition = newitem.Key; 
         olditem.Value.SpinWordStartingPosition = newitem.Key; 
         NewSpintaxListDict.Add(newitem.Key, olditem.Value); 
         //} 
         break; 
        } 
       }       
      } 
     } 

     Init.SpintaxEditorPropertyMain.SpintaxListDict = new Dictionary<int, SpintaxMappedValue>(NewSpintaxListDict); 
    }    
} 

我這是怎麼做的?

這本詞典關鍵是每個詞的索引字符串

在請幫我提前 謝謝!

+3

我認爲你需要編輯你的問題有點。這對我沒有意義。 – Enigmativity

+0

使用stringbuilder而不是字符串... – Maruti

+0

也許我不完全理解你想要做什麼,但是Dictionary似乎是錯誤的結構。你爲什麼不使用數組來存儲單詞?使用Dictionary,每次修改較大的字符串時,基本上都需要重新構建它的一部分或全部。 – hatchet

回答

0

字符串在C#中是不可變的。這意味着一旦它們被設定,它們就不會改變。當你再次設置變量時,你實際上正在分配一個新的字符串,並且舊的被清除(如果不再被引用)。

字符串將不得不脫離你的對象來實現你所需要的東西,並且我會建議每次請求時使用字符串生成器來生成屬性。你也可以使用髒標誌來查看它是否需要在字典發生變化時生成。

+0

我可以使用IDynamicMetaObjectProvider來解決這個問題 – Jay

+0

從我理解的IDynamicMetaObjectProvider不會停止字符串不可變。你在想如何使用IDynamicMetaObjectProvider? – Jason

+0

什麼是解決此問題的最佳方法...請幫助我 – Jay

0

如果你在一個句子替換話,我只想去一個與string.replace()爲基礎的方法

originalString = originalString.Replace("man","women and man"); 

這樣,你不需要關心與不斷變化的換出的子串索引。

0
var original = "A man meet a man"; 

//updated in response to comment 
//var dict = Regex.Matches(original, @"\b\w+\b").Cast<Match>().ToDictionary(m => m.Index, m=> m.Value); 

var dict = Regex.Matches(original, @"\b\w+\b") 
    .Cast<Match>() 
    .GroupBy(m => m.Value, m=> m.Index) 
    .ToDictionary(g => g.Min(), g=> g.Key); 

當字符串改變時,重新創建字典。

使用字典:

string s = dict[2]; 
Console.WriteLine(s=="man"); //prints True 

dict[2] = "new string"; 
Console.WriteLine(dict[2]=="new string"); //prints True 
+0

這是好的...但這個詞多次出現,該怎麼辦... – Jay

+0

你想要它做什麼?你想在字典中只用一次嗎? –

+0

該索引是映射值列表...我如何移動值列表到相應的索引 – Jay

相關問題