public int Compare(IEnumerable <SelfSealed> x, IEnumerable <SelfSealed> y) { var setX = new CycleDetectionSet(); var setY = new CycleDetectionSet(); using var enumeratorX = x.GetEnumerator(); using var enumeratorY = y.GetEnumerator(); while (true) { var xDone = !enumeratorX.MoveNext(); var yDone = !enumeratorY.MoveNext(); if (xDone) { return(yDone ? 0 : -1); } if (yDone) { return(1); } var xCurrent = enumeratorX.Current; var yCurrent = enumeratorY.Current; var compare = Compare(xCurrent, yCurrent, setX, setY); if (compare != 0) { return(compare); } } }
public static TResult InvokeCompare <TContext, TComparable, TResult>( this MethodInfo method, Type actualType, TContext context, TComparable x, TComparable y, CycleDetectionSet xSet, CycleDetectionSet ySet) { var isDeclaringTypeMatchedActualMemberType = typeof(TComparable) == actualType; if (!isDeclaringTypeMatchedActualMemberType) { // todo: 1. cache delegates and benchmark ways: // - direct Invoke; // - DynamicInvoke; // var genericType = typeof(Method.StaticMethodDelegate<>).MakeGenericType(type); // var @delegate = compareMethod.CreateDelegate(genericType); // return (int)@delegate.DynamicInvoke(this, x, y, hash); // - DynamicMethod; // - generate static class wrapper. return((TResult)method.Invoke( null, new object[] { context, x, y, xSet, ySet })); } var compare = method.CreateDelegate <Func <TContext, TComparable, TComparable, CycleDetectionSet, CycleDetectionSet, TResult> >(); return(compare(context, x, y, xSet, ySet)); }
public int Compare(SelfSealed x, SelfSealed y) { var setX = new CycleDetectionSet(); var setY = new CycleDetectionSet(); return(Compare(x, y, setX, setY)); }
public int Compare(CycledStructObject x, CycledStructObject y) { var setX = new CycleDetectionSet(); var setY = new CycleDetectionSet(); return(Compare(x, y, setX, setY)); }
public int Compare(CycledStruct x, CycledStruct y) { var setX = new CycleDetectionSet(); var setY = new CycleDetectionSet(); var compare = Compare(x, y, setX, setY); if (compare != 0) { return(compare); } return(setX.Count - setY.Count); }
private static int Compare(SelfSealed x, SelfSealed y, CycleDetectionSet setX, CycleDetectionSet setY) { if (ReferenceEquals(x, y)) { return(0); } if (y is null) { return(1); } if (x is null) { return(-1); } // & because, both methods need to be executed. if (!setX.TryAdd(x, 0) & !setY.TryAdd(y, 0)) { return(setX.Count - setY.Count); } var compareFirst = Compare(x.First, y.First, setX, setY); if (compareFirst != 0) { return(compareFirst); } var compareSecond = Compare(x.Second, y.Second, setX, setY); if (compareSecond != 0) { return(compareSecond); } var compareValue = x.Value.CompareTo(y.Value); if (compareValue != 0) { return(compareValue); } setX.Remove(x, out _); setY.Remove(y, out _); return(0); }
public static int Compare(CycledStruct x, CycledStruct y, CycleDetectionSet xSet, CycleDetectionSet ySet) { var compare = Nullable.Compare(x.Property, y.Property); if (compare != 0) { return(compare); } compare = CycledStructObject.RelationalComparer.Compare(x.FirstObject, y.FirstObject, xSet, ySet); if (compare != 0) { return(compare); } return(CycledStructObject.RelationalComparer.Compare(x.SecondObject, y.SecondObject, xSet, ySet)); }
public static int Compare( CycledStructObject x, CycledStructObject y, CycleDetectionSet setX, CycleDetectionSet setY) { if (ReferenceEquals(x, y)) { return(0); } if (y is null) { return(1); } if (x is null) { return(-1); } // & because, both methods need to be executed. if (!setX.TryAdd(x, 0) & !setY.TryAdd(y, 0)) { return(setX.Count - setY.Count); } var compare = string.CompareOrdinal(x.TextField, y.TextField); if (compare != 0) { return(compare); } compare = CycledStruct.RelationalComparer.Compare(x.FirstStruct, y.FirstStruct, setX, setY); if (compare != 0) { return(compare); } return(CycledStruct.RelationalComparer.Compare(x.SecondStruct, y.SecondStruct, setX, setY)); }
public static int Compare( CycledStruct?x, CycledStruct?y, CycleDetectionSet xSet, CycleDetectionSet ySet) { if (x.HasValue) { if (y.HasValue) { return(Compare(x.Value, y.Value, xSet, ySet)); } return(1); } if (y.HasValue) { return(-1); } return(0); }