/// <summary> /// Merges this <see cref="GameData"/> with another. /// </summary> /// <param name="otherData">The <see cref="GameData"/> to merge into this one.</param> /// <returns>A <see cref="string"/> array of the changed keys. Will be empty if no data changed.</returns> public string[] MergeWith(GameData otherData) { var changedKeys = new List <string>(); foreach (var otherItem in otherData.SyncableItems) { SyncableItem localItem; if (SyncableItems.TryGetValue(otherItem.Key, out localItem)) { var selectedItem = ConflictResolver.ResolveConflict(localItem, otherItem.Value); if (!selectedItem.Equals(localItem)) { SyncableItems[otherItem.Key] = selectedItem; changedKeys.Add(otherItem.Key); } } else { SyncableItems.Add(otherItem.Key, otherItem.Value); changedKeys.Add(otherItem.Key); } } foreach (var otherCurrency in otherData.SyncableCurrencies) { SyncableCurrency localCurrency; if (SyncableCurrencies.TryGetValue(otherCurrency.Key, out localCurrency)) { var mergeResult = localCurrency.MergeWith(otherCurrency.Value); if (mergeResult) { changedKeys.Add(otherCurrency.Key); } } else { SyncableCurrencies.Add(otherCurrency.Key, otherCurrency.Value); changedKeys.Add(otherCurrency.Key); } } return(changedKeys.ToArray()); }