Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Generics e proprietà come parametri
Forum - C# / VB.NET - [VB.NET] Generics e proprietà come parametri

Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Segnala al moderatore
Postato alle 15:42
Domenica, 19/12/2010
Salve a tutti,
sto creando una classe di tipo Collection(Of T) che eredita da ObservableCollection(Of T), e voglio creare un metodo Order per ordinare la classe in base ad una proprietà di T che dev'essere passata come parametro del metodo.
Per fare un semplice esempio:
Codice sorgente - presumibilmente VB.NET

  1. Class Libro
  2.  
  3.     Dim _Titolo As String
  4.     Public ReadOnly Property Titolo As String
  5.         Get
  6.             Return _Titolo
  7.         End Get
  8.     End Property
  9.  
  10. End Class
  11.  
  12. Class SortableObservableCollection(Of T)
  13.  
  14.     Public Sub Sort(ByVal [Property] As PropertyInfo)
  15.         'Secondo la mia implementazione dell'algoritmo InsertionSort (che fa schifo, ma un po alla volta li implemento tutti)
  16.         'dato che utilizzo un ciclo for each, arrivo al punto in cui devo fare Item(i).[Property].Valore < Item(i-1).[Property].Valore
  17.         '
  18.         'Come fare?
  19.     End Sub
  20.  
  21. End Class



Tempo fa Il Totem mi aveva consigliato di utilizzare la classe PropertyInfo.
Ma poi ho scoperto che c'era una soluzione migliore al mio problema e ho cambiato strada.
In questo caso non ho altre idee, e ad ogni modo, vorrei definitivamente capire come si fa.

Mi potreste dare una mano?
Grazie davvero! :k:


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2764
Iscritto: 21/09/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 16:08
Domenica, 19/12/2010
purtroppo non è furbo fare così, esistono già dei metodi di estensione che si occupano di ordinare le collection, e tramite linq puoi anche specificare il campo sul quale fare l'ordinamento.

Utilizzare propertyinfo è fattibile ma devi arrivarci con la reflection al campo su cui vuoi effettuare il sorting, e se non sei ferrato in .NET potrebbe presentare qualche problema.

Se il tuo è un programma di esempio ti consiglio di utilizzare collection di tipi semplici, cioè non classi.



Ingegnere Informatico
https://ldlagency.it
PM
Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 16:45
Domenica, 19/12/2010
No il programma è per un utilizzo personale.

Il punto è che volevo creare dei miei metodi di ordinamento, per arrivare ad utilizzare il quicksort (che dovrebbe essere il più veloce in assoluto da quanto ho letto), che spero possa essere più rapido rispetto all'algoritmo di ordinamento utilizzato dalla classe base (o magari si basa già sul quicksort).
Sta di fatto che se ho una collezione con 300-400 000 oggetti, nell'ordinarla non è che sia tanto veloce..


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2764
Iscritto: 21/09/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 17:08
Domenica, 19/12/2010
Testo quotato

Postato originariamente da dedalux:

No il programma è per un utilizzo personale.

Il punto è che volevo creare dei miei metodi di ordinamento, per arrivare ad utilizzare il quicksort (che dovrebbe essere il più veloce in assoluto da quanto ho letto), che spero possa essere più rapido rispetto all'algoritmo di ordinamento utilizzato dalla classe base (o magari si basa già sul quicksort).
Sta di fatto che se ho una collezione con 300-400 000 oggetti, nell'ordinarla non è che sia tanto veloce..



il quicksort è già utilizzato internamente a tutti i metodi sort di tutte le collection. A riprova di questo posto il sorgente della classe ArraySortHelper che viene utilizzata internamente al framework .NET per ordinare qualsiasi tipo di collezione:

Codice sorgente - presumibilmente VB.NET

  1. <TypeDependency("System.Collections.Generic.GenericArraySortHelper`2")> _
  2. Friend Class ArraySortHelper(Of TKey, TValue)
  3.     Implements IArraySortHelper(Of TKey, TValue)
  4.     ' Methods
  5.     <SecuritySafeCritical> _
  6.     Public Shared Function CreateArraySortHelper() As IArraySortHelper(Of TKey, TValue)
  7.         If GetType(IComparable(Of TKey)).IsAssignableFrom(GetType(TKey)) Then
  8.             ArraySortHelper(Of TKey, TValue).defaultArraySortHelper = DirectCast(RuntimeTypeHandle.Allocate(GetType(GenericArraySortHelper(Of String, String)).TypeHandle.Instantiate(New Type() { GetType(TKey), GetType(TValue) })), IArraySortHelper(Of TKey, TValue))
  9.         Else
  10.             ArraySortHelper(Of TKey, TValue).defaultArraySortHelper = New ArraySortHelper(Of TKey, TValue)
  11.         End If
  12.         Return ArraySortHelper(Of TKey, TValue).defaultArraySortHelper
  13.     End Function
  14.  
  15.     Friend Shared Sub QuickSort(ByVal keys As TKey(), ByVal values As TValue(), ByVal left As Integer, ByVal right As Integer, ByVal comparer As IComparer(Of TKey))
  16.         Do
  17.             Dim a As Integer = left
  18.             Dim b As Integer = right
  19.             Dim num3 As Integer = (a + ((b - a) >> 1))
  20.             ArraySortHelper(Of TKey, TValue).SwapIfGreaterWithItems(keys, values, comparer, a, num3)
  21.             ArraySortHelper(Of TKey, TValue).SwapIfGreaterWithItems(keys, values, comparer, a, b)
  22.             ArraySortHelper(Of TKey, TValue).SwapIfGreaterWithItems(keys, values, comparer, num3, b)
  23.             Dim y As TKey = keys(num3)
  24.             Do
  25.                 Do While (comparer.Compare(keys(a), y) < 0)
  26.                     a += 1
  27.                 Loop
  28.                 Do While (comparer.Compare(y, keys(b)) < 0)
  29.                     b -= 1
  30.                 Loop
  31.                 If (a > b) Then
  32.                     Exit Do
  33.                 End If
  34.                 If (a < b) Then
  35.                     Dim local2 As TKey = keys(a)
  36.                     keys(a) = keys(b)
  37.                     keys(b) = local2
  38.                     If (Not values Is Nothing) Then
  39.                         Dim local3 As TValue = values(a)
  40.                         values(a) = values(b)
  41.                         values(b) = local3
  42.                     End If
  43.                 End If
  44.                 a += 1
  45.                 b -= 1
  46.             Loop While (a <= b)
  47.             If ((b - left) <= (right - a)) Then
  48.                 If (left < b) Then
  49.                     ArraySortHelper(Of TKey, TValue).QuickSort(keys, values, left, b, comparer)
  50.                 End If
  51.                 left = a
  52.             Else
  53.                 If (a < right) Then
  54.                     ArraySortHelper(Of TKey, TValue).QuickSort(keys, values, a, right, comparer)
  55.                 End If
  56.                 right = b
  57.             End If
  58.         Loop While (left < right)
  59.     End Sub
  60.  
  61.     Public Sub Sort(ByVal keys As TKey(), ByVal values As TValue(), ByVal index As Integer, ByVal length As Integer, ByVal comparer As IComparer(Of TKey))
  62.         Try
  63.             If ((comparer Is Nothing) OrElse (comparer Is Comparer(Of TKey).Default)) Then
  64.                 comparer = Comparer(Of TKey).Default
  65.             End If
  66.             ArraySortHelper(Of TKey, TValue).QuickSort(keys, values, index, (index + (length - 1)), comparer)
  67.         Catch exception1 As IndexOutOfRangeException
  68.             Dim objArray As Object() = New Object(3  - 1) {}
  69.             objArray(1) = GetType(TKey).Name
  70.             objArray(2) = comparer
  71.             Throw New ArgumentException(Environment.GetResourceString("Arg_BogusIComparer", objArray))
  72.         Catch exception As Exception
  73.             Throw New InvalidOperationException(Environment.GetResourceString("InvalidOperation_IComparerFailed"), exception)
  74.         End Try
  75.     End Sub
  76.  
  77.     Private Shared Sub SwapIfGreaterWithItems(ByVal keys As TKey(), ByVal values As TValue(), ByVal comparer As IComparer(Of TKey), ByVal a As Integer, ByVal b As Integer)
  78.         If (((a <> b) AndAlso (a <> b)) AndAlso (comparer.Compare(keys(a), keys(b)) > 0)) Then
  79.             Dim local As TKey = keys(a)
  80.             keys(a) = keys(b)
  81.             keys(b) = local
  82.             If (Not values Is Nothing) Then
  83.                 Dim local2 As TValue = values(a)
  84.                 values(a) = values(b)
  85.                 values(b) = local2
  86.             End If
  87.         End If
  88.     End Sub
  89.  
  90.  
  91.     ' Properties
  92.     Public Shared ReadOnly Property [Default] As IArraySortHelper(Of TKey, TValue)
  93.         Get
  94.             Dim defaultArraySortHelper As IArraySortHelper(Of TKey, TValue) = ArraySortHelper(Of TKey, TValue).defaultArraySortHelper
  95.             If (defaultArraySortHelper Is Nothing) Then
  96.                 defaultArraySortHelper = ArraySortHelper(Of TKey, TValue).CreateArraySortHelper
  97.             End If
  98.             Return defaultArraySortHelper
  99.         End Get
  100.     End Property
  101.  
  102.  
  103.     ' Fields
  104.     Private Shared defaultArraySortHelper As IArraySortHelper(Of TKey, TValue)
  105. End Class





Ingegnere Informatico
https://ldlagency.it
PM
Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 14:30
Mercoledì, 22/12/2010
Grazie HeDo per il chiarimento!
Scusandomi per la risposta tardiva, ho scopero questa sezione sul sito di Totem, http://totemslair.org/guide/linq.php e vorrei fare una colletta per un erigergli un monumento... Qualcuno si aggrega? :rotfl:

No scherzi a parte, penso di aver risolto il mio problema, al massimo torno a scassare XD

Grazie ancora! :k:


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM