linq-to-query并包含IEnumerable <string>?

时间:2015-08-11 21:29:18

标签: c# linq linq-to-sql

我有字符串列表IEnumerable<string> companies 包含公司,即麦当劳,sony inc

我想与数据库中的值进行比较。我从数据库中获取列表,在foreach循环中我比较

 if (companies.Any(c => c.Contains(name.ToLower())))
 {...}

在数据库中我有公司,即 mcdonalds inc,sony

使用&#34; sony&#34;进行搜索它找到了。当我使用&#34; mcdonalds inc&#34;它没有。因为附加词&#34; inc&#34;

我知道我比较公司。任何(包含(mcdonalds inc))并且它找不到它。

有关如何扩展if条件并通过诗歌进行比较的任何建议

3 个答案:

答案 0 :(得分:0)

为什么不将您的字符串列表与数据库进行比较,而不是将数据库与列表进行比较?

foreach(var name in list)
{
     if(table.Any(t => SqlMethods.Like(name, string.Format("%{0}%", t.Column))
     { ... 
     }
 }

这将捕捉名称广泛但不完全相同的差异。

答案 1 :(得分:0)

您可以在比较之前调用Split,并仅比较列表中的第一个元素。在这种情况下,您总是会丢弃'inc'。 这当然只有在您的问题发生时才会起作用,因为您可能有必须丢弃的后缀。

答案 2 :(得分:0)

这取决于你需要字符串匹配的模糊程度。例如,您可能无法从字符串中删除所有出现的inc,因为名为“The inc company”或“Inception”的公司可能会受到影响。

对于您的具体示例,您基本上需要从字符串的末尾删除一些术语(比如说inc,incorpate和llc)。我们还要说字符串末尾可能不止一个术语。您可以使用正则表达式执行此操作,例如

    Regex termRemover = new Regex("^(?<companyName>.*?)(\\s+(inc|incorporated|llc))*$");

然后可以在您的示例中使用

    string scrubbedName = termRemover.Match(name.ToLower()).Groups["companyName"].Value;
    if (companies.Any(c => c.Contains(scrubbedName)))
    {...}

(加上错误检查等,为简洁而放在这里)。公司清单应在使用前以相同方式清洗;否则你的索尼公司将永远不会匹配任何磨砂只是索尼。

相关问题