检查字典中的子字符串(字符串)并返回键的(子字符串)值

时间:2018-01-24 13:27:28

标签: c# linq dictionary

我有一个如下的字典,

Page {
   id: p_basicpage
   anchors.fill: parent

现在我的要求说当字符串包含PropStreetSuffixDict.Add("ROAD", "RD"); PropStreetSuffixDict.Add("STREET","ST"); and many more. ROAD的子字符串时,我想返回该子字符串的相关值。

例如.. STREET应该返回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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您希望它在输入字符串(NAME SEQ MyTableName1 1280 MyTableName1 3000 )中返回第一个匹配项,则会变得有点棘手。

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

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

答案 2 :(得分:0)

我建议使用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;
}

它将采用输入字符串,将其拆分,并将单个单词替换为所提供字典中的单词。 RegEx的特定\w*将匹配任何连续的“单词”字符,因此它将在空格,逗号,短划线以及不属于“单词”的任何其他内容上中断。 / p>

此代码 使用您可能无法访问的一些较新的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));

以下结果:

  

教会跨越RD
  教堂跨越ST
  教堂跨越RD,离开其他ST