辞書には興味のない多くのキーがあり、その場合は自分が持っているものに固執していない限り、すべてのメッセージに対して辞書ルックアップを実行する必要はありません。
これ以外の場合は、辞書に登録されているキーがわかっているため、列挙できます。
現在、キーを確認した後で値を検索しているというメッセージでは、辞書を列挙すると空き値が得られるという特別な利点があるため、別の参照が削除されます。
次に、処理したいキーについて、第2辞書からint16を参照するだけです。
あなたがより効率的にこれを処理して、このようなあなたのコードベースを減らすことができます(infoHashがしたいだけのキーを持っていると仮定した場合):
private List<MessageName> createMsgObject(Dictionary<string, string> infoHash, Dictionary<string, Int16> msgDescritionAndID)
{
MessageName msgName = null;
List<MessageName> msgNameList = new List<MessageName>();
var msgObjOuter = new MessageName();
// there is no need to perform an o(1) lookup of infoHash for 40 variables.
// You already have a list of keys it contains so just enumerate them.
foreach (KeyValuePair<string, string> info in infoHash)
{
var msg = new MessageName() { MessageID = msgDescritionAndID[info.Key] };
switch (info.Key)
{
// switch all of your int16 versions first:
case "redis_version":
case "hash_int_message_2":
case "hash_int_message_3":
msg.DiagnosticCnt = Convert.ToInt32(infoHash[info.Value]);
break;
// switch on all message types getting int16 from info.Key
case "msg_int_message_1":
case "msg_int_message_2":
msg.DiagnosticCnt = Convert.ToInt32(msgDescritionAndID[info.Key]);
break;
// everything left over is reading value from our current info.
// default:
msg.DiagnosticStr = info.Value;
break;
}
msgNameList.Add(msgName);
}
return msgNameList;
}
infoHashがであなたの興味を持っていないキーが含まれている場合でも、あなたはこのようにそれをコーディングすることができます:別のメソッドへ
private List<MessageName> createMsgObject(Dictionary<string, string> infoHash, Dictionary<string, Int16> msgDescritionAndID)
{
MessageName msgName = null;
List<MessageName> msgNameList = new List<MessageName>();
var msgObjOuter = new MessageName();
// there is no need to perform an o(1) lookup of infoHash for 40 variables.
// You already have a list of keys it contains so just enumerate them.
foreach (KeyValuePair<string, string> info in infoHash)
{
var msg = new MessageName() { MessageID = msgDescritionAndID[info.Key] };
switch (info.Key)
{
// switch all of your int16 versions first:
case "redis_version":
case "hash_int_message_2":
case "hash_int_message_3":
msg.DiagnosticCnt = Convert.ToInt32(infoHash[info.Value]);
break;
// switch on all message types getting int16 from info.Key
case "msg_int_message_1":
case "msg_int_message_2":
msg.DiagnosticCnt = Convert.ToInt32(msgDescritionAndID[info.Key]);
break;
// switch on all message types that have DiagnosticStr in info.Value;
case "msg_str_message_1":
case "msg_str_message_2":
msg.DiagnosticStr = info.Value;
break;
default: // everything left over we are not interested in
continue;
break;
}
msgNameList.Add(msgName);
}
return msgNameList;
}
使用スイッチhttps://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/switchと抽出メッセージ作成。 –
辞書がたくさんのキーを持っている場合は、自分の持っているものにこだわるのに興味がありません。私の答えを見ないなら。 –