1
string originaltext = "A man meet a man";
string spintext ="A {man|Person} meet a {man|male}";

每个原文都可以有一些自旋选项,所以每个单词都是起始索引指向自旋选项单词...

例如:“man”的第一次出现有自旋选项“{man|Person}”。“man”的第二次出现有自旋选项“{man|male}”...

如果原文改变了,那么所有的词索引都在改变......所以我想指出新的索引......

 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);
     }            
 }

这就是我正在做的...

这个字典键是字符串中每个单词的索引

请帮助我提前谢谢!

4

3 回答 3

0

如果您要替换句子中的单词,我只会使用基于 string.Replace() 的方法

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

这样你就不需要关心用不断变化的索引换出子字符串。

于 2013-08-30T03:27:36.447 回答
0

字符串在 C# 中是不可变的。这意味着一旦设置它们就不会改变。当您再次设置变量时,您实际上是在分配一个新字符串,并且旧字符串被清除(如果不再引用)。

字符串必须脱离您的对象才能实现您的要求,我建议每次请求时使用字符串生成器来生成属性。您也可以使用脏标志来查看字典更改时是否需要生成它。

于 2013-08-30T03:13:52.907 回答
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
于 2013-08-30T05:09:31.117 回答