将lambda作为参数传递给将查询ResourceSet的Method

时间:2013-10-11 13:15:30

标签: c# lambda

我必须在每个ResourceSet中按某种字符串模式过滤Key。为此,我的函数必须作为参数接收 lambda表达式。我对 lambda 没有经验,所以我不知道如何查询 ResourceSet 中的每个 DictionaryEntry

这是我目前的方法,但看起来很丑陋和旧:

public IDictionary<string, string> FindStrings(string resourceName, params string[] pattern)
{
    OpenResource(resourceName);

    ResourceSet resourceSet = _currentResourseManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
    Dictionary<string, string> result = new Dictionary<string, string>();

    foreach (DictionaryEntry entry in resourceSet)
    {
        string resourceKey = entry.Key.ToString();

        foreach (string p in pattern)
        {
            if (resourceKey.StartsWith(p))
            {
                string resource = entry.Value.ToString();
                result.Add(resourceKey, resource);
            }
        }
    }

    return result;
}

我的Func参数看起来如何? lambda看起来怎么样?

1 个答案:

答案 0 :(得分:2)

您希望传递一个谓词,它是一个接受字符串的函数,并返回一个布尔值,指示输入字符串是否与某些条件匹配。

以下是您的实施方式:

public IDictionary<string, string> FindStrings(string resourceName, Func<string, boolean> keySelector)
{
    OpenResource(resourceName);

    ResourceSet resourceSet = _currentResourseManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
    Dictionary<string, string> result = new Dictionary<string, string>();

    foreach (DictionaryEntry entry in resourceSet)
    {
        string resourceKey = entry.Key.ToString();

        if (keySelector(resourceKey))
        {
            string resource = entry.Value.ToString();
            result.Add(resourceKey, resource);
        }

    }

    return result;
}

以下是使用lambda表达式调用方法的方法:

var patterns = new string[] { "test1", "test2" };
var results = FindString("Resource1", key => patterns.Any(p => key.StartsWith(p)));

有关代表的更多信息:Delegates (C# Programming Guide) - MSDN。 有关lambda表达式的更多信息:Lambda Expressions (C# Programming Guide) - MSDN

希望这有帮助。