diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeIdEqualityComparer.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeIdEqualityComparer.cs new file mode 100644 index 0000000000..6f197ade1e --- /dev/null +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeIdEqualityComparer.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace umbraco.MacroEngines +{ + public class DynamicNodeIdEqualityComparer : EqualityComparer + { + + public override bool Equals(DynamicNode x, DynamicNode y) + { + //Check whether the compared objects reference the same data. + if (Object.ReferenceEquals(x, y)) return true; + + //Check whether any of the compared objects is null. + if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) + return false; + + //Check whether the nodes ids are equal. + return x.Id == y.Id; + + } + + public override int GetHashCode(DynamicNode obj) + { + if (Object.ReferenceEquals(obj, null)) return 0; + + //Get hash code for the Name field if it is not null. + int hashId = obj.Id.GetHashCode(); + + return hashId; + } + + } +} diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs index e8c4e0f594..f61e16e51a 100644 --- a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs @@ -87,6 +87,50 @@ namespace umbraco.MacroEngines result = Aggregate(args, name); return true; } + if (name == "Union") + { + if ((args.First() as IEnumerable) != null) + { + result = new DynamicNodeList(this.Items.Union(args.First() as IEnumerable)); + return true; + } + if ((args.First() as DynamicNodeList) != null) + { + result = new DynamicNodeList(this.Items.Union((args.First() as DynamicNodeList).Items)); + return true; + } + } + if (name == "Except") + { + if ((args.First() as IEnumerable) != null) + { + result = new DynamicNodeList(this.Items.Except(args.First() as IEnumerable, new DynamicNodeIdEqualityComparer())); + return true; + } + if ((args.First() as DynamicNodeList) != null) + { + result = new DynamicNodeList(this.Items.Except((args.First() as DynamicNodeList).Items, new DynamicNodeIdEqualityComparer())); + return true; + } + } + if (name == "Intersect") + { + if ((args.First() as IEnumerable) != null) + { + result = new DynamicNodeList(this.Items.Intersect(args.First() as IEnumerable, new DynamicNodeIdEqualityComparer())); + return true; + } + if ((args.First() as DynamicNodeList) != null) + { + result = new DynamicNodeList(this.Items.Intersect((args.First() as DynamicNodeList).Items, new DynamicNodeIdEqualityComparer())); + return true; + } + } + if (name == "Distinct") + { + result = new DynamicNodeList(this.Items.Distinct(new DynamicNodeIdEqualityComparer())); + return true; + } if (name == "Pluck" || name == "Select") { result = Pluck(args); diff --git a/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj b/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj index 00224ceb49..57d1c7183e 100644 --- a/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj +++ b/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj @@ -80,6 +80,7 @@ Code +