Hi
I have an issue with "asort" and using a codeblock, where in some instances i get the error. (there are quite a few posts on google showing the same kind of error)
"Exception raised by CLR or external code:Unable to sort because the IComparer.Compare() method returns inconsistent results. Either a value does not compare equal to itself, or one value repeatedly compared to another value yields different results. IComparer: 'XSharp.RT.ArraySortComparer'"
My example i'm using : asort({|x,y| x[2]<=y[2] })
I noticed that in ArraySortComparer that ASort uses (your code below), you are comparing the array (object) to see if it's the same, and not the individual element of the array (which i understand you can't do, as the element is not known as stored in the codeblock)
I guess the only solution would be for the codeblock to return 0 if they are the same e.g. in the below example. (this would obvious break all Asort Codeblocks, but could be a solution !)
{|x,y| iif(x[2]==y[2],0,iif(x[2]<=y[2],-1,1)) }
In the mean time, i'm going back to using "AQuickSort" which i got from the forum many years ago.
STRUCTURE ArraySortComparer<T, U> IMPLEMENTS System.Collections.Generic.IComparer<T> WHERE T IS NEW()
PRIVATE _cb AS @@Func<T,T,LOGIC>
CONSTRUCTOR( cb AS @@Func<T,T,LOGIC> )
_cb := cb
RETURN
METHOD Compare( x AS T, y AS T ) AS INT
IF Object.ReferenceEquals(x, y )
RETURN 0
ENDIF
LOCAL u AS LOGIC
u := _cb( x, y )
RETURN IIF ( u , -1, 1 )
https://docs.microsoft.com/en-us/dotnet ... ew=net-5.0
Thanks, Ian
Asort using codeblocks errors
Asort using codeblocks errors
Ian,
I think the solution to the problem is to change
to
to make sure that when x and y point to a different memory location but have the same value they are also treated as "Equal".
Robert
I think the solution to the problem is to change
Code: Select all
IF Object.ReferenceEquals(x, y )
RETURN 0
ENDIF
Code: Select all
IF Object.Equals(x, y )
RETURN 0
ENDIF
Robert
XSharp Development Team
The Netherlands
robert@xsharp.eu
The Netherlands
robert@xsharp.eu
Asort using codeblocks errors
Hi Robert
Thanks for your quick reply. I thought you would need to compare the actual Element, but i guess if this works then i could try.
Thanks, Ian
Thanks for your quick reply. I thought you would need to compare the actual Element, but i guess if this works then i could try.
Thanks, Ian
Asort using codeblocks errors
Ian,
Can you mail an example of what you were testing to make sure that it works ?
Robert
Can you mail an example of what you were testing to make sure that it works ?
Robert
XSharp Development Team
The Netherlands
robert@xsharp.eu
The Netherlands
robert@xsharp.eu