0

我有以下代码与确切的文化或文化的通配符版本匹配。

使用“en-TH”的文化,返回的字符串应该是“en-**”,因为它已由通配符匹配。“en-US”文化将返回“en-US”,“ar-AK”文化将返回 null。

但是,使用下面的代码,“en-US”的文化会返回两个字符串:

"en-US"
"en-**"

我想知道这是否是因为 OR 运算符在这种情况下没有进行“短路”评估?IE 我不想在这种情况下返回 'en-**'

string cultureToMatch = "en-TH";
IEnumerable<string> cultures = new string[] { "en-US", "en-**", "fr-**", "en-KH", "ar-AR" };

for (int i = 0; i < cultureToMatch.Length; i++)
{
    char searchChar = cultureToMatch[i];
    cultures = cultures.Where(w => w.IndexOf(searchChar, i, 1) >= 0 ||
                                   w.IndexOf('*', i, 1) >= 0)
                                    .ToList();
}
4

2 回答 2

1

请尝试以下操作。它将首先尝试过滤实际字符,并且只有在没有匹配项时才会尝试使用通配符进行过滤。

string cultureToMatch = "en-US";
IEnumerable<string> cultures = new string[] { "en-US", "en-**", "fr-**", "en-KH", "ar-AR" };

for (int i = 0; i < cultureToMatch.Length; i++)
{
    char searchChar = cultureToMatch[i];
    var tempFilter = cultures.Where(w => w.IndexOf(searchChar, i, 1) >= 0);
    if (!tempFilter.Any())
        tempFilter = cultures.Where(w => w.IndexOf('*', i, 1) >= 0);
    cultures = tempFilter.ToList();
}
于 2013-02-04T13:07:05.020 回答
0

不,这是因为条件是针对每个项目单独评估的。

字符串en-US匹配条件的第一部分,字符串en-**匹配条件的第二部分。条件的第一部分对一个项目为真这一事实并不妨碍条件的第二部分对另一个项目进行评估。

如果要搜索最相关的匹配项,则必须对数据进行两次运行,或者根据相关性对结果进行排序并获得第一个匹配项。

于 2013-02-04T12:33:15.850 回答