linq-to-query,并包含一个ienumerablestring <
本文关键字:ienumerablestring 包含一 linq-to-query | 更新日期: 2023-09-27 18:07:20
我有字符串IEnumerable<string> companies
的列表包含公司,即麦当劳,索尼公司。
我想与数据库中的值进行比较。我从数据库中获取列表并在foreach循环中比较
if (companies.Any(c => c.Contains(name.ToLower())))
{...}
在数据库中我有公司,即麦当劳公司,索尼
当使用"sony"搜索时,它会找到它。当我搜索"麦当劳公司"时,它没有。因为额外的单词"inc"
我知道我在比较公司。任何(包含(麦当劳公司)),它找不到它。
关于如何扩展if条件来通过诗句
为什么不将字符串列表与数据库进行比较,而将数据库与列表进行比较呢?
foreach(var name in list)
{
if(table.Any(t => SqlMethods.Like(name, string.Format("%{0}%", t.Column))
{ ...
}
}
这将捕获名称大致相同但不完全相同的差异。
可以在比较之前调用Split,只比较列表中的第一个元素。在这种情况下,你总是会丢弃'inc'。当然,这只会在您的问题仅仅是因为您可能有必须丢弃的后缀而发生时才会起作用。
这取决于您需要的字符串匹配的模糊程度。例如,您可能无法从字符串中删除所有出现的inc,因为名为"inc公司"或"盗梦空间"的公司可能会受到影响。
对于您的特定示例,您基本上需要从字符串的末尾删除一些术语(例如inc、incorporated和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)))
{...}
(加上错误检查等,为简洁起见,此处省略)。公司名单在使用前应以同样的方式擦洗;否则你的索尼公司将永远不会匹配任何擦除索尼的东西。