在一系列值上执行操作的C#模式是什么?

Pab*_*loG 5 c#

我有这个代码:

if (PsionTeklogix.Keyboard.Keyboard.GetModifierKeyState(Key.Orange) == KeyState.Lock)
    PsionTeklogix.Keyboard.Keyboard.InjectKeyboardCommand(Function.Orange, 0, 0);

if (PsionTeklogix.Keyboard.Keyboard.GetModifierKeyState(Key.Blue) == KeyState.Lock)
    PsionTeklogix.Keyboard.Keyboard.InjectKeyboardCommand(Function.Blue, 0, 0);

if (PsionTeklogix.Keyboard.Keyboard.GetModifierKeyState(Key.Shift) == KeyState.Lock)
    PsionTeklogix.Keyboard.Keyboard.InjectKeyboardCommand(Function.Shift, 0, 0);

if (PsionTeklogix.Keyboard.Keyboard.GetModifierKeyState(Key.Control) == KeyState.Lock)
    PsionTeklogix.Keyboard.Keyboard.InjectKeyboardCommand(Function.Control, 0, 0);

...
Run Code Online (Sandbox Code Playgroud)

我想重构将键/函数定义与动作分开的代码.Key.xxx和Function.xxx不是同一类型.

例如:在Python中,我可以简单地执行以下操作:

keys = (
    ( Key.Orange, Function.Orange ),
    ( Key.Blue  , Function.Blue ),
    ( Key.Shift , Function.Shift ),
    ...
    )

psi_key = PsionTeklogix.Keyboard.Keyboard

for key, func in keys:
    if psi_key.GetModifierKeyState(key) == KeyState.Lock):
        psi_key.InjectKeyboardCommand(func, 0, 0)
Run Code Online (Sandbox Code Playgroud)

在C#中做什么是"正确的方法"?

Jon*_*eet 13

你可以做一些非常相似的事:

Dictionary<Key, Function> keys = new Dictionary<Key, Function>
{
    { Key.Orange, Function.Orange },
    { Key.Blue, Function.Blue }
    ...
};

foreach (var pair in keys)
{
    if (Keyboard.GetModifierKeyState(pair.Key) == KeyState.Locked)
    {
        Keyboard.InjectKeyboardCommand(pair.Value, 0, 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想要,你甚至可以使用LINQ:

foreach (var pair in keys.Where(pair => 
                 Keyboard.GetModifierKeyState(pair.Key) == KeyState.Locked)
{
    Keyboard.InjectKeyboardCommand(pair.Value, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)

Dictionary鉴于我们没有找到任何东西,现在使用a 有点奇怪.如果您使用的是.NET 4,则可以使用元组列表:

var keys = new List<Tuple<Key, Function>>()
{
    Tuple.Of(Key.Orange, Function.Orange),
    Tuple.Of(Key.Blue, Function.Blue),
    ...
};
Run Code Online (Sandbox Code Playgroud)

并相应地调整循环.您也可以使用匿名类型:

var keys = new[]
{
    new { Key = Key.Orange, Function = Function.Orange },
    new { Key = Key.Blue, Function = Function.Blue },
    ...
};
Run Code Online (Sandbox Code Playgroud)

它们基本上都充当代表键/功能对的方式:)