Es ist nicht notwendig, eine Wörterbuchsuche für alle Ihre Nachrichten durchzuführen, es sei denn, Ihr Wörterbuch enthält viele Schlüssel, die Sie nicht interessieren. In diesem Fall bleiben Sie bei dem, was Sie haben.
Andernfalls wissen Sie bereits, welche Schlüssel im Wörterbuch sind, so dass Sie sie einfach aufzählen können.
Für die Nachricht, dass Sie gerade den Wert nach der Suche nach dem Schlüssel suchen, werden Sie eine weitere Suche ausschalten, da das Aufzählen des Wörterbuchs den zusätzlichen Vorteil hat, den Wert kostenlos zu erhalten.
Dann ist alles, was Sie tun müssen, das int16 aus Ihrem zweiten Wörterbuch nach den Schlüsseln zu suchen, die Sie verarbeiten möchten.
Sie können dies effizienter verarbeiten und Ihre Code-Basis wie folgt reduzieren (unter der Annahme infoHash hat nur Schlüssel Sie möchten):
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;
}
Auch wenn infoHash enthält Schlüssel Ihr nicht interessiert, können Sie es wie dieser Code :
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;
}
Verwenden Schalter https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/switch und Extraktnachrichtenerstellung in der separaten Verfahren. –
Wenn Ihr Wörterbuch groß ist mit vielen Schlüsseln, an denen Sie nicht interessiert sind, bleiben Sie bei dem, was Sie haben. Wenn nicht meine Antwort sehen. –