【问题标题】:check for a substring(of a string) in the dictionary and return the key's(substring) value检查字典中的子字符串(字符串)并返回键的(子字符串)值
【发布时间】:2018-01-24 13:27:28
【问题描述】:

我有一本像下面这样的字典,

PropStreetSuffixDict.Add("ROAD", "RD");    
PropStreetSuffixDict.Add("STREET","ST"); and many more.

现在我的要求是,当字符串包含ROADSTREET 的子字符串时,我想返回该子字符串的相关值。

例如..CHURCH ACROSS ROAD 应该返回RD

这是我尝试过的,仅当输入字符串与字典的键完全相同时才有效。

private string GetSuffix(string input)
{
   string suffix=string.Empty;
   suffix = PropStreetSuffixDict.Where(x => x.Key.ToUpper().Trim() == 
   input.ToUpper().Trim()).FirstOrDefault().Value;
   return suffix;
}

注意: 如果一个字符串包含多个这样的子字符串,那么它应该返回任何子字符串第一次出现的值。 即如果STREET CHURCH ACROSS ROAD是输入,它应该返回ST而不是RD

【问题讨论】:

  • 不完全是你要问的,但你不需要.Where(x).FirstOrDefault(),你可以只拥有.FirstOrDefault(x)。但无论哪种情况,您都需要考虑这可能会返回 null,然后您尝试访问 Value 属性将导致抛出异常

标签: c# linq dictionary


【解决方案1】:

你可以试试这样的

private string GetSuffix(string input)
{
   string suffix=string.Empty;
   string[] test =input.ToUpper().Split(' ');
   suffix =(from dic in PropStreetSuffixDict 
           join inp in test on dic.Key equals inp
           select dic.Value).LastOrDefault();
  return suffix;     
}

拆分输入,然后使用linq

【讨论】:

    【解决方案2】:

    如果您希望它在输入字符串 (GetSuffix("CHURCH STREET ACROSS ROAD) ==> "STREET") 中返回第一次出现,那就有点棘手了。

    下面的代码将查找输入字符串中所有键出现的位置,并返回第一个找到的位置的值。

    private string GetSuffix(string input)
    {
        var suffix = PropStreetSuffixDict
            .Select(kvp => new
            {
                Position = input.IndexOf(kvp.Key.Trim(), StringComparison.CurrentCultureIgnoreCase),
                Value = kvp.Value
            })
            .OrderBy(x => x.Position)
            .FirstOrDefault(x => x.Position > -1)?.Value;
    
        return suffix ?? string.Empty;
    }
    

    如果您不关心输入字符串中出现的顺序,您可以将其简化为:

    private string GetSuffix(string input)
    {
        var suffix = PropStreetSuffixDict.FirstOrDefault(kvp => input.Containts(kvp.Key.Trim(), StringComparison.CurrentCultureIgnoreCase))?.Value;
        return suffix ?? string.Empty;
    }
    

    【讨论】:

      【解决方案3】:

      我建议使用RegEx 来拆分您的单词,这样您就可以在需要时有效地拆分多个字符,而不仅仅是空格。此解决方案还允许非常轻松地替换单个单词,而无需跟踪匹配单词的位置和长度,以及替换值的长度。

      你可以使用这样的函数:

      public string ReplaceWords(string input, Dictionary<string,string> dictionary)
      {
          var result = Regex.Replace(input, @"\w*", (match) =>
          {
              if (dictionary.TryGetValue(match.Value, out var replacement))
              {
                  return replacement;
              }
              return match.Value;
          });
          return result;
      }
      

      它将接受一个输入字符串,将其拆分,然后将单个单词替换为提供的字典中的单词。 \w* 中的特定 RegEx 将匹配任何连续运行的“单词”字符,因此它会在空格、逗号、破折号以及不属于“单词”的任何其他内容上中断。

      此代码确实使用了一些您可能也无法访问的较新的 C# 语言功能(内联输出参数)。如果你不能使用这些,请告诉我,我会更新它以在没有它们的情况下工作。

      你可以这样使用它:

      Console.WriteLine(ReplaceWords("CHURCH ACROSS ROAD", PropStreetSuffixDict));
      Console.WriteLine(ReplaceWords("CHURCH ACROSS STREET", PropStreetSuffixDict));
      Console.WriteLine(ReplaceWords("CHURCH ACROSS ROAD, LEFT AT THE OTHER STREET", PropStreetSuffixDict));
      

      对于以下结果:

      马路对面的教堂
      圣街对面的教堂
      教堂对面,在另一条街左转

      【讨论】:

        猜你喜欢
        • 2014-03-17
        • 1970-01-01
        • 2022-10-26
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多