Lambda表达式 - OR运算符评估双方

时间:2013-02-04 12:29:18

标签: c# lambda

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

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

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

"en-US"
"en-**"

我想知道这是否是因为OR运算符在此上下文中没有进行“短路”评估? I.E.我不希望在这个例子中返回'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();
}

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

不,这是因为每个项目都会单独评估条件。

字符串en-US匹配条件的第一部分,字符串en-**匹配条件的第二部分。对于一个项目条件的第一部分为真的事实并不能防止对另一个项目评估条件的第二部分。

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