ottimo
Io come "esercizio domenicale" ho implementato una classe che risolve il problema con un taglio piu pratico. E' il metodo che ti ho suggerito qualche giorno fa nell'altro post.
L'ho tradotta in vb.net con il traduttore da c# ad occhio credo sia un buon traduttore.
"AndAlso"???? io smetterei di usare questo linguaggio solo per questo!codice:''' <summary> ''' Rappresenta una matrice a due dimensioni. Fornisce un metodo per restituire un istanza ridotta attravrso gli indici da escludere. ''' </summary> ''' <typeparam name="T">Tipo di elementi contenuti nella matrice</typeparam> Public Class MatriceRiducibile(Of T) 'contenitore interno unidimensionale degli elementi Private elementi As List(Of T) ''' <summary> ''' Crea una nuova istanza della classe MatriceRiducibile ''' </summary> ''' <param name="righe">Dimensione 0 (righe)</param> ''' <param name="colonne">Dimensione 1 (colonne)</param> Public Sub New(righe As Integer, colonne As Integer) Length0 = righe Length1 = colonne elementi = New List(Of T)() End Sub ''' <summary> ''' Restituisce la dimensione 0 (righe) ''' </summary> Public Property Length0() As Integer Get Return m_Length0 End Get Private Set m_Length0 = Value End Set End Property Private m_Length0 As Integer ''' <summary> ''' Restituisce la dimensione 1 (colonne) ''' </summary> Public Property Length1() As Integer Get Return m_Length1 End Get Private Set m_Length1 = Value End Set End Property Private m_Length1 As Integer ''' <summary> ''' Ottiene o imposta l'elemento agli indici specificati ''' </summary> ''' <param name="r">Indice di riga</param> ''' <param name="c">Indice di colonna</param> ''' <exception cref="System.IndexOutOfRangeException"></exception> ''' <exception cref="System.InvalidOperationException"></exception> ''' <remarks>L'inserimento di nuovi elementi può avvenire solo in modo sequenziae</remarks> Public Default Property Item(r As Integer, c As Integer) As T Get 'check sugli indici If r > Length0 OrElse c > Length1 Then Throw New IndexOutOfRangeException("indici fuori dimensione") End If 'elemento non ancora inserito If r * Length1 + c > elementi.Count Then Return Nothing End If Return elementi.ElementAt(r * Length1 + c) End Get Set 'check sugli indici If r > Length0 OrElse c > Length1 Then Throw New IndexOutOfRangeException("indici fuori dimensione") End If 'elemento non ancora inserito If r * Length1 + c > elementi.Count Then Throw New InvalidOperationException("Elemento non modificabile") End If 'gli indici corrispondono alla posizione del prossimo elemento quindi aggiungo... If r * Length1 + c = elementi.Count Then elementi.Add(value) Else '...altrimenti l'elemento è gia stato inserito quindi modifico elementi(r * Length1 + c) = value End If End Set End Property ''' <summary> ''' Restituisce una nuova istanza della classe MatriceRiducibile che contiene tutti gli elementi dell'oggetto corrente eccetto quelli i cui indici di riga o di colonna sono presenti nell'insieme di input ''' </summary> ''' <param name="indici">Insieme degli indici da escludere</param> ''' <exception cref="System.ArgumentOutOfRangeException"></exception> Public Function Riduci(indici As Integer()) As MatriceRiducibile(Of T) If Not IndiciDiRiduzioneValidi(indici) Then Throw New ArgumentOutOfRangeException("L'insieme contiene indici non validi") End If Dim ridotta As New MatriceRiducibile(Of T)(Length0 - indici.GetLength(0), Length1 - indici.GetLength(0)) Dim c As Integer = 0 For i As Integer = 0 To Length0 - 1 For j As Integer = 0 To Length1 - 1 If Not indici.Contains(i) AndAlso Not indici.Contains(j) Then Dim ri As Integer = c \ ridotta.Length1 Dim rj As Integer = c Mod ridotta.Length1 ridotta(ri, rj) = Me(i, j) c += 1 End If Next Next Return ridotta End Function Private Function IndiciDiRiduzioneValidi(indici As Integer()) As Boolean Return indici.All(Function(i) i <= Length0 AndAlso i <= Length1) End Function End Class![]()


.
Rispondi quotando