using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
public static void Main()
{
var foos = Enumerable.Range(1, 1000).Select(_ => new Foo()).ToList();
new Test().GroupChanges(foos);
}
public void GroupChanges<TResult>(List<TResult> changes)
{
const string KeyPropertyName = "TransactionSequence";
var changeSet = changes
.GroupBy(change => /*change.TransactionSequence */
(byte[])change.GetType().GetProperty(KeyPropertyName).GetValue(change)
, new ArrayComparer<byte>())
.ToList();
Console.WriteLine(changeSet.Count);
}
}
public class Foo
{
private static readonly byte[][] Keys = new[] {
Guid.NewGuid().ToByteArray(),
Guid.NewGuid().ToByteArray(),
Guid.NewGuid().ToByteArray()
};
private
static readonly Random
rand = new Random
();
public Foo()
{
this.
TransactionSequence = Keys
[rand.
Next(3)]; }
public byte[] TransactionSequence { get; private set; }
}
public class ArrayComparer<T> : IEqualityComparer<T[]>
{
public bool Equals(T[] x, T[] y)
{
return x.SequenceEqual(y);
}
public int GetHashCode(T[] obj)
{
return obj.GetHashCode();
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCiAgICB7CiAgICAgICAgdmFyIGZvb3MgPSBFbnVtZXJhYmxlLlJhbmdlKDEsIDEwMDApLlNlbGVjdChfID0+IG5ldyBGb28oKSkuVG9MaXN0KCk7CiAgICAgICAgCiAgICAgICAgbmV3IFRlc3QoKS5Hcm91cENoYW5nZXMoZm9vcyk7CiAgICB9CiAgICAKICAgIHB1YmxpYyB2b2lkIEdyb3VwQ2hhbmdlczxUUmVzdWx0PihMaXN0PFRSZXN1bHQ+IGNoYW5nZXMpCiAgICB7CiAgICAgICAgY29uc3Qgc3RyaW5nIEtleVByb3BlcnR5TmFtZSA9ICJUcmFuc2FjdGlvblNlcXVlbmNlIjsKCiAgICAgICAgdmFyIGNoYW5nZVNldCA9IGNoYW5nZXMKICAgICAgICAgICAgLkdyb3VwQnkoY2hhbmdlID0+IC8qY2hhbmdlLlRyYW5zYWN0aW9uU2VxdWVuY2UgKi8gCiAgICAgICAgICAgICAgICAoYnl0ZVtdKWNoYW5nZS5HZXRUeXBlKCkuR2V0UHJvcGVydHkoS2V5UHJvcGVydHlOYW1lKS5HZXRWYWx1ZShjaGFuZ2UpCiAgICAgICAgICAgICAgICAsIG5ldyBBcnJheUNvbXBhcmVyPGJ5dGU+KCkpCiAgICAgICAgICAgIC5Ub0xpc3QoKTsKICAgICAgICAgICAgCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoY2hhbmdlU2V0LkNvdW50KTsKICAgIH0KfQoKcHVibGljIGNsYXNzIEZvbwp7CiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBieXRlW11bXSBLZXlzID0gbmV3W10gewogICAgICAgICAgICBHdWlkLk5ld0d1aWQoKS5Ub0J5dGVBcnJheSgpLAogICAgICAgICAgICBHdWlkLk5ld0d1aWQoKS5Ub0J5dGVBcnJheSgpLAogICAgICAgICAgICBHdWlkLk5ld0d1aWQoKS5Ub0J5dGVBcnJheSgpCiAgICAgICAgfTsKICAgICAgICAKICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOwogICAgCiAgICBwdWJsaWMgRm9vKCkKICAgIHsKICAgICAgICB0aGlzLlRyYW5zYWN0aW9uU2VxdWVuY2UgPSBLZXlzW3JhbmQuTmV4dCgzKV07CiAgICB9CiAgICAKICAgIHB1YmxpYyBieXRlW10gVHJhbnNhY3Rpb25TZXF1ZW5jZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KfQoKcHVibGljIGNsYXNzIEFycmF5Q29tcGFyZXI8VD4gOiBJRXF1YWxpdHlDb21wYXJlcjxUW10+CnsKICAgIHB1YmxpYyBib29sIEVxdWFscyhUW10geCwgVFtdIHkpCiAgICB7CiAgICAgICAgcmV0dXJuIHguU2VxdWVuY2VFcXVhbCh5KTsKICAgIH0KCiAgICBwdWJsaWMgaW50IEdldEhhc2hDb2RlKFRbXSBvYmopCiAgICB7CiAgICAgICAgcmV0dXJuIG9iai5HZXRIYXNoQ29kZSgpOwogICAgfQp9