В вашем коде целый ряд проблем и неэффективностей.
Если вы собираетесь создать несколько словарей, создайте словари напрямую.Не используйте отдельный экземпляр для заполнения значений и копирования из.
Никогда не используйте конкатенацию строк в таком цикле.Используйте StringBuilder
или другой подобный механизм для создания ваших строк.У вас уже есть значения в коллекции, поэтому использование String.Join()
в сочетании с LINQ поможет вам в этом.
Ваш подход к получению значений из словаря, по меньшей мере, неудобен.Обычно вы пытаетесь прочитать ключ только один раз TryGetValue()
.Ваш код использует его неправильно.Если вы собираетесь проверить, существует ли ключ в словаре (используя Contains()
), то нет смысла использовать TryGetValue()
.Что еще хуже, вы сделали это , а затем вручную искали ключ во внутреннем словаре, просматривая пары ключ-значение.
Типичный шаблон выглядит следующим образом:
DictValueType value;
if (myDict.TryGetValue(key, out value))
{
// key was in the dictionary, the value is stored in the `value` variable
}
Код, который вы могли бы написать гораздо намного более эффективно, как это:
var tableList = new Dictionary<string, Dictionary<string, string>>
{
{ "Table1", new Dictionary<string, string>
{
{ "Field1", "abc" },
{ "Field2", "def" },
{ "Field3", "ghi" },
{ "Field4", "jkl" },
}
},
{ "Table2", new Dictionary<string, string>
{
{ "Field1", "xyz" },
{ "Field2", "uvw" },
{ "Field3", "rst" },
}
},
{ "Table3", new Dictionary<string, string>
{
{ "Field1", "123" },
{ "Field2", "456" },
}
},
};
// Display tables and corresponding fields
txtMessage.Text = String.Join("\r\n",
tableList.SelectMany(table =>
table.Value.Select(fieldList =>
String.Format("Table={0}, Field={1} - {2}",
table.Key, fieldList.Key, fieldList.Value)
)
).ToArray()
);
// (I hope you have this in a separate method)
// Try to find tables and fields in the lists, and list the value if found
string tableToFind = "Table2";
string fieldToFind = "Field2";
var builder = new StringBuilder(txtMessage.Text); // mostly useful if you have a
// lot of different strings to add
Dictionary<string, string> foundTable;
if (tableList.TryGetValue(tableToFind, out foundTable))
{
builder.AppendLine()
.Append("Table=" + tableToFind + " exist in table list");
string foundField;
if (foundTable.TryGetValue(fieldToFind, out foundField))
{
builder.AppendLine()
.AppendFormat("Table={0}, Field={1} with value={2} exist in table list",
tableToFind, fieldToFind, foundField);
}
}
txtMessage.Text = builder.ToString();
Вложенные словари - это не плохо, этохороший способ организовать иерархию ключей и значений.Но для того, чтобы поддерживать его в рабочем состоянии, вы, как правило, должны инкапсулировать все в другом классе, предоставляя методы для манипулирования данными без непосредственного управления словарями.Вы можете сделать это как эффективным, так и ремонтопригодным.Как реализовать это упражнение, оставленное вам.