如何使用 .contains() 方法检查我的列表中是否有任何单词
How to check if any word in my List using .contains() method
我想使用 .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"
传递时,我得到了记录。
如何通过将问题传递为“将语言更改为法语”来获得正确的记录?
Update - 我想传递一个像 change language to french
这样的句子,我想使用 french
这个词并将其与 LanguageName
属性 的 USerLanguage
个对象
假设您只是想 return 所有包含问题中提到的语言的 UserLanguage 对象,您可以执行以下操作:
更新 UserLanguage 对象,使您有一个包含国家/地区的新 属性。从 LanguageName 中删除国家/地区。我已将其设置为字符串,但它可以是带有 'Name'、iso 代码等的国家/地区对象。然后您可以将 LanguageCode 移出,因为它可能与现在可以容纳在国家/地区对象中的国家/地区代码匹配:
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)'
需要注意的一件事是,这意味着您可以使用该语言 return 多种语言。使用法语有很多以法语为主要语言的国家。
更新
如果您真的不想更改 UserLanguage 对象,那么您可以在分隔符上拆分 LanguageName。但是,我认为您当前的选择是在白色 space 上拆分,这可能会导致 'Mandarin Chinese' 等某些语言出现问题。这实际上取决于您如何填充该列表。一个更安全的选择可能是始终假设国家/地区在括号中,如果是这样,您可以这样做:
var language = allLanguage.Where(l => culture.CompareInfo.IndexOf(question, l.LanguageName.Split('(')[0].Trim(), CompareOptions.IgnoreCase) >=0);
这将检查问题是否包含与 LanguageName 匹配的任何内容,一旦它在第一个括号处被拆分,取第一部分(因此索引为 0)并从第一部分中删除任何尾随的白色 space。
我想使用 .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"
传递时,我得到了记录。
如何通过将问题传递为“将语言更改为法语”来获得正确的记录?
Update - 我想传递一个像 change language to french
这样的句子,我想使用 french
这个词并将其与 LanguageName
属性 的 USerLanguage
个对象
假设您只是想 return 所有包含问题中提到的语言的 UserLanguage 对象,您可以执行以下操作:
更新 UserLanguage 对象,使您有一个包含国家/地区的新 属性。从 LanguageName 中删除国家/地区。我已将其设置为字符串,但它可以是带有 'Name'、iso 代码等的国家/地区对象。然后您可以将 LanguageCode 移出,因为它可能与现在可以容纳在国家/地区对象中的国家/地区代码匹配:
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)'
需要注意的一件事是,这意味着您可以使用该语言 return 多种语言。使用法语有很多以法语为主要语言的国家。
更新
如果您真的不想更改 UserLanguage 对象,那么您可以在分隔符上拆分 LanguageName。但是,我认为您当前的选择是在白色 space 上拆分,这可能会导致 'Mandarin Chinese' 等某些语言出现问题。这实际上取决于您如何填充该列表。一个更安全的选择可能是始终假设国家/地区在括号中,如果是这样,您可以这样做:
var language = allLanguage.Where(l => culture.CompareInfo.IndexOf(question, l.LanguageName.Split('(')[0].Trim(), CompareOptions.IgnoreCase) >=0);
这将检查问题是否包含与 LanguageName 匹配的任何内容,一旦它在第一个括号处被拆分,取第一部分(因此索引为 0)并从第一部分中删除任何尾随的白色 space。