根据特定特征将给定值映射到操作

时间:2015-02-27 10:56:54

标签: dictionary predicate

假设我有一定的价值,我想根据它可能具有的某些特征对它做些什么。

例如,假设值为string,如果以L开头,我想将其打印到屏幕上,如果长度小于20,则将其保存到文件中如果最后一个字符与第一个字符相同,则播放声音。

当然,一个选项是简单的if else if结构:

if (value[0] == 'L')
    ....
else if (value.Length < 20)
    ....
else if (value[0] == value.Last())
    ....

然而,在很多条件下,这可能会很快变得难看。所以另一个选项是Dictionary。但是我不确定如何使用Dictionary来实现这一目标。

如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以构建一个字典,其中包含在满足条件时应执行的条件和操作。通常,如果您需要使用类型T,则此字典将具有类型Dictionary<Predicate<T>, Action<T>>。对于string,它可以是:

var conditions = new Dictionary<Predicate<string>, Action<string>>
{
    {s => s.StartsWith("L"), s => Console.WriteLine("Starts with L")},
    {s => s.Length < 20, s => Console.WriteLine("Has fewer that 20 symbols")},
};

string input = "some input";

foreach (var condition in conditions)
{
    if (condition.Key(input)) condition.Value(input);
}

事实上,你甚至不需要Dictionary - 你可以使用List<Tuple<Predicate<string>, Action<string>>>,或者甚至更好 - 引入一个包含谓词和动作的简单小类。