c 23 compare two objects for changes

Solutions on MaxInterview for c 23 compare two objects for changes by the best coders in the world

showing results for - "c 23 compare two objects for changes"
Camila
28 Oct 2017
1public static JObject FindDiff(this JToken Current, JToken Model)
2{
3    var diff = new JObject();
4    if (JToken.DeepEquals(Current, Model)) return diff;
5
6    switch(Current.Type)
7    {
8        case JTokenType.Object:
9            {
10                var current = Current as JObject;
11                var model = Model as JObject;
12                var addedKeys = current.Properties().Select(c => c.Name).Except(model.Properties().Select(c => c.Name));
13                var removedKeys = model.Properties().Select(c => c.Name).Except(current.Properties().Select(c => c.Name));
14                var unchangedKeys = current.Properties().Where(c => JToken.DeepEquals(c.Value, Model[c.Name])).Select(c => c.Name);
15                foreach (var k in addedKeys)
16                {
17                    diff[k] = new JObject
18                    {
19                        ["+"] = Current[k]
20                    };
21                }
22                foreach (var k in removedKeys)
23                {
24                    diff[k] = new JObject
25                    {
26                        ["-"] = Model[k]
27                    };
28                }
29                var potentiallyModifiedKeys = current.Properties().Select(c => c.Name).Except(addedKeys).Except(unchangedKeys);
30                foreach (var k in potentiallyModifiedKeys)
31                {
32                    var foundDiff = FindDiff(current[k], model[k]);
33                    if(foundDiff.HasValues) diff[k] = foundDiff;
34                }
35            }
36            break;
37        case JTokenType.Array:
38            {
39                var current = Current as JArray;
40                var model = Model as JArray;
41                var plus = new JArray(current.Except(model, new JTokenEqualityComparer()));
42                var minus = new JArray(model.Except(current, new JTokenEqualityComparer()));
43                if (plus.HasValues) diff["+"] = plus;
44                if (minus.HasValues) diff["-"] = minus;
45            }
46            break;
47        default:
48            diff["+"] = Current;
49            diff["-"] = Model;
50            break;
51    }
52
53    return diff;
54}