如何使用 .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。