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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top