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