2010-08-11 9 views
5

मैं इस कोड है:मूल्यों की एक श्रृंखला पर कार्रवाई करने के लिए सी # पैटर्न क्या है?

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); 

... 

और मैं कोड कार्यों से कुंजी/समारोह परिभाषा अलग refactor करना चाहते हैं। Key.xxx और Function.xxx एक ही प्रकार से नहीं हैं।

जैसे: अजगर में, मैं बस की तरह कुछ कर सकता है:

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) 

"सही तरीके से" सी # में करने के लिए क्या है?

+0

@ जिमी: मुझे लगता है कि आप मानते हैं कि वह कैसा मान रहा है। शायद वह नया है? किसी भी मामले में, सी # में 'के लिए' वह नहीं करेगा जो वह पूछ रहा है।उसे 'foreach' का उपयोग करने की जरूरत है। –

+0

मेरी इच्छा है कि हम टिप्पणियों को कम कर सकें क्योंकि @ जिमी होफा जिसकी आवश्यकता नहीं है। – JonH

+0

@ जिमी: मुझे foreach के बारे में पता है, लेकिन मैं प्रारंभिक सरणी बनाने के लिए एक गैर verbose रास्ता तलाश रहा था। और हाँ, मैं एक सी # नौसिखिया हूं (इसके बारे में क्षमा करें) – PabloG

उत्तर

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); 
    } 
} 

तुम भी LINQ इस्तेमाल कर सकते हैं यदि आप चाहते थे:

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

अब एक Dictionary का उपयोग कर कुछ हद तक यहाँ अजीब यह देखते हुए कि हम नहीं देख रहे है कुछ भी ऊपर आप नेट 4 उपयोग कर रहे हैं आप के बजाय tuples की एक सूची इस्तेमाल कर सकते हैं:

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

और उसके अनुसार पाश समायोजित करें। आपको गुमनाम प्रकार भी इस्तेमाल कर सकते हैं:

var keys = new[] 
{ 
    new { Key = Key.Orange, Function = Function.Orange }, 
    new { Key = Key.Blue, Function = Function.Blue }, 
    ... 
}; 

वे सभी मूल रूप से कुंजी/समारोह जोड़े का प्रतिनिधित्व :)

+1

'शब्दकोश' कार्यान्वयन के साथ एक संभावित समस्या पर ध्यान दें: जोड़ों का आदेश ** बाहर ** जोड़े के क्रम के समान होने की गारंटी नहीं है ** ** में। यदि यह आदेश महत्वपूर्ण है, तो यह एक समस्या हो सकती है। हालांकि, वर्तमान कार्यान्वयन (.NET में, मोनो के बारे में निश्चित नहीं है) को देखते हुए, मेरा मानना ​​है कि यह * जोड़े को उसी क्रम में वापस कर देगा, क्योंकि उन्हें कभी भी हटाया नहीं गया है। –

+0

धन्यवाद, अनाम प्रकार ठीक काम करता है! अन्य विकल्प उपलब्ध नहीं हैं: मैं .NET CF 2 का उपयोग कर रहा हूं, क्षमा करें मैंने पहले इसका उल्लेख नहीं किया था। – PabloG

+0

@ पी डैडी: मुझे लगता है कि आप सभी गिनती पर सही हैं - और यह निश्चित रूप से निर्भर नहीं होना चाहिए। –

0

के तरीके आप इस के लिए एक Dictionary इस्तेमाल कर सकते हैं के रूप में कार्य कर रहे हैं।

Dictionary<Key, Function> map = new Dictionary<Key, Function>(); 

map.Add(Key.Orange, Function.Orange); 
map.Add(Key.Blue, Function.Blue); 
map.Add(Key.Shift, Function.Shift); 
map.Add(Key.Control, Function.Control); 

foreach(var pair in map) 
{ 
    if (PsionTeklogix.Keyboard.Keyboard.GetModifierKeyState(map.Key) == KeyState.Lock) 
    { 
     PsionTeklogix.Keyboard.Keyboard.InjectKeyboardCommand(map.Value, 0, 0); 
    } 
} 
1

कुंजी और समारोह enumerations हैं मान लिया जाये, तो आप भी आजमा सकते हैं:

foreach (Key key in Enum.GetValues(typeof(Key))) 
{ 
    if (PsionTeklogix.Keyboard.Keyboard.GetModifierKeyState(key) == KeyState.Lock) 
    { 
     PsionTeklogix.Keyboard.Keyboard.InjectKeyboardCommand((Function)Enum.Parse(typeof(Function), key.ToString()), 0, 0); 
    } 
} 
1
using PsionTeklogix.Keyboard; /* assuming that's a namespace, */ 
           /* otherwise, you can optionally do: */ 
/* using Keyboard = PsionTeklogix.Keyboard.Keyboard; */ 

class Foo{ 
    static readonly Key[] keys = {Key.Orange, Key.Blue, Key.Shift, ...}; 
    static readonly Function[] functions = {Function.Orange, Function.Blue, Function.Shift, ...}; 

    static void Main(){ 
     for(int i = 0; i < keys.Length; i++) 
      if(Keyboard.GetModifierKeyState(keys[i]) == KeyState.Lock) 
       Keyboard.InjectKeyboardCommand(func, 0, 0); 
    } 
} 

वैकल्पिक रूप से, क्योंकि यह की तरह दोनों Key और Function enums, और आप एक ही Function का उपयोग कर रहे हैं लग रहा है प्रत्येक Key enum मान के लिए enum मान नाम, आप ऐसा कुछ कर सकते हैं, जो थोड़ा सा मामूली है, थोड़ा सा धीमा:

static readonly string[] values = {"Orange", "Blue", "Shift", ...}; 

static void Main(){ 
    foreach(string value in values) 
     if(Keyboard.GetModifierKeyState((Key)Enum.Parse(typeof(Key), value)) == KeyState.Lock); 
      Keyboard.InjectKeyboardCommand((Function)Enum.Parse(typeof(Function), value), 0, 0); 
} 

ठीक है, शायद यह सुंदर नहीं है। भावहीन।

लेकिन, अगर मूल्यों Key की भी Function के मूल्यों (यानी, अगर (int)Key.Orange == (int)Function.Orange, आदि) है, तो आप की तरह कुछ कर सकते हैं के रूप में ही कर रहे हैं:

static readonly Key[] keys = {Key.Orange, Key.Blue, Key.Shift, ...}; 

static void Main(){ 
    foreach(Key key in keys) 
     if(Keyboard.GetModifierKeyState(key) == KeyState.Lock); 
      Keyboard.InjectKeyboardCommand((Function)key, 0, 0); 
} 

इनमें से कोई नहीं

class KeyFunction{ 
    readonly Key  key; 
    readonly Function function; 

    public Key  Key  {get{return key;}} 
    public Function Function{get{return function;}} 

    public KeyFunction(Key key, Function function){ 
     this.key  = key; 
     this.function = function; 
    } 
} 

static readonly KeyFunction[] keyFunctions = { 
    new KeyFunction(Key.Orange, Function.Orange), 
    new KeyFunction(Key.Blue, Key.Blue), 
    new KeyFunction(Key.Shift, Key.Shift), 
    ... 
}; 

static void Main(){ 
    foreach(KeyFunction kf in keyFunctions) 
     if(Keyboard.GetModifierKeyState(kf.Key) == KeyState.Lock) 
      Keyboard.InjectKeyboardCommand(kf.Function, 0, 0); 
} 

सबसे वर्बोज़ सोल है कि: एक प्रत्यक्ष अजगर कोड के बराबर है, और अधिक इस तरह होगा जो है सभी का ध्यान, लेकिन यह सबसे लचीला है।

संबंधित मुद्दे

 संबंधित मुद्दे