diff --git a/src/ResXManager.Model/ResourceEntity.cs b/src/ResXManager.Model/ResourceEntity.cs index c2b3aad6..afa87f6a 100644 --- a/src/ResXManager.Model/ResourceEntity.cs +++ b/src/ResXManager.Model/ResourceEntity.cs @@ -82,22 +82,22 @@ public bool Update(ProjectFile file, [NotNullWhen(true)] out ResourceLanguage? u private void UpdateResourceTableEntries() { - var unmatchedTableEntries = _resourceTableEntries.ToList(); + var entriesByKey = _resourceTableEntries.ToDictionary(entry => entry.Key); var keys = _languages.Values .SelectMany(language => language.ResourceKeys) .Distinct() .ToArray(); + var matchedKeys = new HashSet(); var index = 0; foreach (var key in keys) { - var existingEntry = _resourceTableEntries.FirstOrDefault(entry => entry.Key == key); - if (existingEntry != null) + if (entriesByKey.TryGetValue(key, out var existingEntry)) { existingEntry.Update(index); - unmatchedTableEntries.Remove(existingEntry); + matchedKeys.Add(key); } else { @@ -107,6 +107,9 @@ private void UpdateResourceTableEntries() index += 1; } + var unmatchedTableEntries = _resourceTableEntries + .Where(entry => !matchedKeys.Contains(entry.Key)) + .ToList(); _resourceTableEntries.RemoveRange(unmatchedTableEntries); } diff --git a/src/ResXManager.Model/Snapshot.cs b/src/ResXManager.Model/Snapshot.cs index 4ae86c21..60b596e9 100644 --- a/src/ResXManager.Model/Snapshot.cs +++ b/src/ResXManager.Model/Snapshot.cs @@ -56,13 +56,27 @@ private static void UnloadSnapshot(IEnumerable resourceEntities) private static void Load(this IEnumerable resourceEntities, IEnumerable entitySnapshots) { + var entitySnapshotMap = entitySnapshots + .GroupBy(snapshot => (snapshot.ProjectName?.ToUpperInvariant(), snapshot.UniqueName?.ToUpperInvariant())) + .ToDictionary(g => g.Key, g => g.First()); + resourceEntities.ForEach(entity => { - var entrySnapshots = entitySnapshots.Where(snapshot => Equals(entity, snapshot)).Select(s => s.Entries).FirstOrDefault() ?? Array.Empty(); + var entityKey = (entity.ProjectName?.ToUpperInvariant(), entity.UniqueName?.ToUpperInvariant()); + var entrySnapshots = entitySnapshotMap.TryGetValue(entityKey, out var entitySnapshot) + ? entitySnapshot.Entries ?? Array.Empty() + : Array.Empty(); + + var entrySnapshotMap = entrySnapshots + .Where(s => s.Key != null) + .GroupBy(s => s.Key ?? string.Empty, StringComparer.Ordinal) + .ToDictionary(g => g.Key, g => g.First().Data ?? Array.Empty(), StringComparer.Ordinal); entity.Entries.ForEach(entry => { - var data = entrySnapshots.Where(s => string.Equals(entry.Key, s.Key, StringComparison.Ordinal)).Select(s => s.Data).FirstOrDefault() ?? Array.Empty(); + var data = entrySnapshotMap.TryGetValue(entry.Key, out var snapData) + ? snapData + : Array.Empty(); entry.Snapshot = data.ToDictionary(item => new CultureKey(item.Language), item => new ResourceData { Text = item.Text, Comment = item.Comment }); });