0

正確なカルチャ、またはカルチャのワイルドカードバージョンに一致する次のコードがあります。

'en-TH'のカルチャを使用すると、返される文字列は' en-**'である必要があります。これは、ワイルドカードと一致しているためです。'en-US'のカルチャは'en-US'を返し、'ar-AK'のカルチャはnullを返します。

ただし、以下のコードでは、「en-US」のカルチャは2つの文字列を返します。

"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-**条件の 2 番目の部分に一致します。条件の最初の部分が 1 つのアイテムに対して true であるという事実は、条件の 2 番目の部分が別のアイテムに対して評価されることを妨げません。

最も関連性の高い一致を検索する場合は、データを 2 回実行するか、関連性で結果を並べ替えて最初の一致を取得する必要があります。

于 2013-02-04T12:33:15.850 に答える