Private/ComparerBuilder.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
$code = @"
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Management.Automation; namespace ListFunctions { public class ScriptBlockComparer<T> : IEqualityComparer<T> { public ScriptBlock EqualityTester { get; set; } public ScriptBlock HashCodeScript { get; set; } public ScriptBlockComparer() { } public ScriptBlockComparer(ScriptBlock tester) { this.EqualityTester = tester; } public bool Equals(T x, T y) { if (this.EqualityTester == null) { return x.Equals(y); } bool answer = false; foreach (PSObject pso in this.EqualityTester.Invoke(x, y)) { bool? maybe = pso.ImmediateBaseObject as bool?; if (maybe.HasValue && maybe.Value) { answer = true; break; } } return answer; } public int GetHashCode(T item) { if (this.HashCodeScript == null) { return item.GetHashCode(); } foreach (PSObject pso in this.HashCodeScript.Invoke(item)) { int? maybe = pso.ImmediateBaseObject as int?; if (maybe.HasValue) { return maybe.Value; } } return item.GetHashCode(); } } } "@ $atArgs = @{ TypeDefinition = $code Language = "CSharp" ReferencedAssemblies = @( "System", "System.Collections", "System.Management.Automation", "System.Linq" ) } Add-Type @atArgs |