Conversione di array doppio in array IComparable
-
03-07-2019 - |
Domanda
Sto provando a creare una classe base Quicksort usando VB.NET, assumendone una matrice di elementi IComparable. La firma è simile al seguente:
public shared sub Sort(ByVal values() as IComparable)
Tuttavia, quando passo una matrice di doppi, il compilatore mi dà errori.
Dim numbers(100) as double
Dim random as new Random(0)
for i as integer = 0 to numbers.length - 1
numbers(i) = random.NextDouble()
Next
QuickSort.Sort(numbers) ' gives compiler error.
L'errore è:
Error 88 Value of type '1-dimensional array of Double' cannot be converted to '1-dimensional array of System.IComparable' because 'Double' is not derived from 'System.IComparable'. C:\Proving Grounds\Module1.vb
La documentazione di .NET afferma che il doppio implementa IComparable. Perché il compilatore .NET non mi consente di farlo?
Soluzione
Sebbene double
possa essere impostato su IComparable
, ciò non significa che double[]
possa essere impostato su IComparable[]
. Una semplice opzione sarebbe quella di creare un nuovo IComparable<T>
array e copiarne i dati - o nel tuo caso, semplicemente avviare l'array originale come IComparer<T>
.
In realtà, sarei tentato di usare le interfacce Comparison<T>
o Comparer<T>.Default
generiche o il <=> delegato - tutti usando generici - questo permette anche l'uso di <=> e comparatori non predefiniti.