У меня есть два словаря информации, один из них поступает из базы данных, а другой - из локальных устройств.Как сравнить два словаря и создать новый в одном направлении
У меня есть метод, который сравнивает то, что находится на локальном устройстве, с тем, что находится в базе данных. Если на устройстве есть что-то, что нет в базе данных, я хочу добавить его в базу данных. Меня не волнует, есть ли что-то в базе данных, которая не на устройстве.
Вот метод, который я написал, чтобы справиться с этой задачей:
private static PackageHistory GetPkgChangeList(PackageHistory devicePackageHistory, PackageHistory databasePackageHistory)
{
var changeList = new PackageHistory();
foreach (var devicePkg in devicePackageHistory.Keys)
{
// do we have a database entry for this package
var databaseEntryList = new List<Tuple<string, DateTime>>();
if (databasePackageHistory.TryGetValue(devicePkg, out databaseEntryList))
{
// compare entries, add missing to list
foreach (var deviceEntry in devicePackageHistory[devicePkg])
{
// TODO: Not sure if the equality is done automatically
if (!databaseEntryList.Contains(deviceEntry))
{
var changeListEntries = new List<Tuple<string, DateTime>>();
if (changeList.TryGetValue(devicePkg, out changeListEntries))
{
changeListEntries.Add(new Tuple<string, DateTime>(deviceEntry.Item1, deviceEntry.Item2));
}
else
{
changeList.Add(devicePkg, new List<Tuple<string, DateTime>> { new Tuple<string, DateTime>(deviceEntry.Item1, deviceEntry.Item2)});
}
}
}
}
else
{
// add missing package and its history to change list
changeList.Add(devicePkg, devicePackageHistory[devicePkg].ConvertAll(entry => new Tuple<string, DateTime>(entry.Item1, entry.Item2)));
}
}
return changeList;
}
Вот PackageHistory
класс:
protected class PackageHistory : Dictionary<string, List<Tuple<string, DateTime>>>
{
}
Что происходит, я иду через все пункты в devicePackageHistory
словаре и сравнивая их с элементами в databasePackageHistory
.
Если я найду товар не в словаре databasePackageHistory
, я добавлю его в словарь changeList
. Этот changeList возвращается в конце функции и отправляется другому методу для дальнейшей обработки.
Я знаю, что алгоритм выглядит сложным, и поэтому я спрашиваю, есть ли более простой способ сравнить два словаря с типами, которые у меня есть, и создать новый словарь с этими изменениями (элементы в словаре устройств не являются словарь базы данных).
Я работаю с устаревшим кодом, поэтому у меня мало места для маневра. Как бы вы это сделали?
EDIT: В основном я обновляю свою базу данных и собирая эту информацию.
Если в этом нет ошибок, [CodeReview] (http://codereview.stackexchange.com/), вероятно, будет лучшим местом для этого вопроса. – JRLambert
Я так не думаю. Я думаю, что есть новая концепция, о которой я не знаю о сравнении словарей. Есть ли причудливые кодовые трюки, которые могут сделать это лучше? – visc