如何使用 .contains() 方法检查我的列表中是不是有任何单词
Posted
技术标签:
【中文标题】如何使用 .contains() 方法检查我的列表中是不是有任何单词【英文标题】:How to check if any word in my List using .contains() method如何使用 .contains() 方法检查我的列表中是否有任何单词 【发布时间】:2021-11-06 03:10:33 【问题描述】:我想使用 .Contains() 来获取记录
var question= "";
var allLanguage = new List<USerLanguage>()
new USerLanguage()LanguageName="English (United States)", LanguageCode="en-US",
new USerLanguage()LanguageName="German (Germany)",LanguageCode="de-DE",
new USerLanguage()LanguageName="French (France)", LanguageCode="fr-FR",
;
var language = allLanguage.Where(r => r.LanguageName.ToLower().Contains(question)).ToList();
现在当我以"change language to french"
传递问题时,我没有得到任何记录,但是当我仅以"french"
传递问题时,我得到了记录。
如何通过将问题传递为“将语言更改为法语”来获得正确的记录?
更新 - 我想传递一个像change language to french
这样的句子,我想把french
这个词与USerLanguage
对象的LanguageName
属性匹配
【问题讨论】:
使用Contains(string,StringComparison)而不是创建一个新的小写字符串。 列表中没有change language to french
,所以Contains
不起作用。您是否试图将一个字符串的一部分与另一个字符串匹配?在这种情况下,您至少必须将问题分成单词。除非您想搜索 change
、language
、to
和 french
,尽管您必须删除不需要的字词
您能否更改 UserLanguage 对象?如果是这样,您能否将国家/地区从 languageName 属性中剔除并为其创建一个单独的属性?
【参考方案1】:
假设您尝试简单地返回包含问题中提到的语言的所有 UserLanguage 对象,您可以执行以下操作:
更新 UserLanguage 对象,使您拥有一个包含 Country 的新属性。从 LanguageName 中删除国家/地区。我已将其设置为字符串,但它可能是带有“名称”、iso 代码等的 Country 对象。然后您可以将 LanguageCode 移出,因为它可能与现在可以容纳在 Country 对象中的国家/地区代码匹配:
public class UserLanguage
public string LanguageName get; set;
public string LanguageCode get; set;
public string Country get; set;
// any other properties you might have
使用这样的对象将允许您搜索问题以查看它是否包含任何 UserLanguage.LanguageName 的:
var culture = CultureInfo.CurrentCulture;
var language = allLanguage.Where(l => culture.CompareInfo.IndexOf(question, l.LanguageName, CompareOptions.IgnoreCase) >=0);
在这里找到不区分大小写的比较:Case insensitive 'Contains(string)'
需要注意的一点是,这意味着您可能会使用该语言返回多种语言。使用法语有很多以法语为主要语言的国家。
更新
如果您真的不想更改 UserLanguage 对象,则可以在分隔符上拆分 LanguageName。但是,我认为您当前的选择是在空白处进行拆分,这可能会导致某些语言(例如“普通话”)出现问题。这实际上取决于您如何填充该列表。一个更安全的选择可能是始终假设国家在括号中,如果是这样,您可以这样做:
var language = allLanguage.Where(l => culture.CompareInfo.IndexOf(question, l.LanguageName.Split('(')[0].Trim(), CompareOptions.IgnoreCase) >=0);
这将检查问题是否包含与 LanguageName 匹配的任何内容,一旦它在第一个括号中被拆分,获取第一部分(因此为 0 索引)并从第一部分删除任何尾随空格。
【讨论】:
我不想更改 USerLanguage 中的任何内容,还有其他方法吗?比如拆分问题或类似的东西 @Mr.Das - 我添加了一个更新,这意味着您不需要更改 UserLanguage 对象culture
之前的CompareInfo
是什么?
@Mr.Das 'culture' 只是对 CultureInfo.CurrentCulture 对象的引用。换句话说,它获取的是当前文化,在这种情况下将用于比较您的问题和您的语言名称以上是关于如何使用 .contains() 方法检查我的列表中是不是有任何单词的主要内容,如果未能解决你的问题,请参考以下文章
Collection.Contains() 使用啥来检查现有对象?
如何在 Java 中的 String.contains() 方法中使用正则表达式
我需要检查 Array1 中的 CHAR 是不是包含我的 Array2 中的一些 CHAR,但我不能将 Contains 用于 CHAR... 如何解决? [关闭]