2008-10-15 7 views
1

J'essaie de créer une classe de base Quicksort en utilisant VB.NET, en prenant un tableau d'éléments IComparable. La signature ressemble à ceci:Conversion de tableau double en tableau IComparable

public shared sub Sort(ByVal values() as IComparable) 

Cependant, quand je passe dans un tableau de doubles, le compilateur me donne des erreurs.

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'erreur est:

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 

Les états de documentation .NET qui double implémentons IComparable. Pourquoi le compilateur .NET ne me laisse-t-il pas faire cela?

Répondre

4

Bien que double puisse être converti en IComparable, cela ne signifie pas que double[] peut être converti en IComparable[]. Une option simple serait de créer un nouveau tableau IComparable[] et de copier les données sur - ou dans votre cas, il suffit de démarrer le tableau d'origine comme IComparable[].

En fait, je serais tenté d'utiliser les IComparable<T> ou IComparer<T> génériques interfaces, ou le délégué Comparison<T> - tous utilisant des génériques - ce qui permet également l'utilisation de Comparer<T>.Default et non par défaut comparateurs.

+0

Oh, c'est vrai. Je devrais effectivement utiliser ces nouvelles fonctionnalités de langue. –

+0

Pouvez-vous donner un exemple comment écrire la méthode de tri avec des génériques? – Alex

+0

@Alex besoin de plus de contexte - quelle est la contribution? Mais l'un de: IComparable-of-T, IComparer-de-T ou Comparer-de-T.Default –

Questions connexes