View Full Version : [C#]Problema con ArrayList
Kleidemos
24-02-2003, 17:17
Ho sto cod:
public int rimuovi(int num)
{
object tmp;
object numero = num as object;
bool trova = false;
for(int i=0;i<this.nome.Count;i++)
{
if(nome[i] == numero)
{
trova = true;
tmp = int.Parse(tmp);
return tmp;
}
else
{
trova = false;
System.Console.WriteLine("Cognome non Presente\n\t\tRiprovare...................");
}
}
this.cognome[tmp] = null;
this.nome[tmp] = null;
return 0;
}
Che dovrebbe rimuovermi, in base al numero che io gli do come argomento, 2 oggetti denominati nome e cognome di tipo System.Collection.ArrayList.
Slo che mi da:
c:\documents and settings\admin\documenti\visual studio projects\agenda appuntamenti\agenda.cs(49,12): error CS1502: The best overloaded method match for 'int.Parse(string)' has some invalid arguments
c:\documents and settings\admin\documenti\visual studio projects\agenda appuntamenti\agenda.cs(49,22): error CS1503: Argument '1': cannot convert from 'object' to 'string'
c:\documents and settings\admin\documenti\visual studio projects\agenda appuntamenti\agenda.cs(50,13): error CS0029: Cannot implicitly convert type 'object' to 'int'
c:\documents and settings\admin\documenti\visual studio projects\agenda appuntamenti\agenda.cs(59,4): error CS1502: The best overloaded method match for 'System.Collections.ArrayList.this[int]' has some invalid arguments
c:\documents and settings\admin\documenti\visual studio projects\agenda appuntamenti\agenda.cs(59,17): error CS1503: Argument '1': cannot convert from 'object' to 'int'
c:\documents and settings\admin\documenti\visual studio projects\agenda appuntamenti\agenda.cs(60,4): error CS1502: The best overloaded method match for 'System.Collections.ArrayList.this[int]' has some invalid arguments
c:\documents and settings\admin\documenti\visual studio projects\agenda appuntamenti\agenda.cs(60,14): error CS1503: Argument '1': cannot convert from 'object' to 'int'
Why?
Kleidemos
24-02-2003, 17:58
ora mi da:
c:\documents and settings\admin\documenti\visual studio projects\agenda appuntamenti\agenda.cs(46,8): error CS0019: Operator '==' cannot be applied to operands of type 'object' and 'int'
c:\documents and settings\admin\documenti\visual studio projects\agenda appuntamenti\agenda.cs(50,13): error CS0029: Cannot implicitly convert type 'int' to 'string'
con:
public string rimuovi(string num)
{
int tmp;
int numero = int.Parse(num);
bool trova = false;
for(int i=0;i<this.nome.Count;i++)
{
if(nome[i] == numero)
{
trova = true;
tmp = numero;
return tmp;
}
else
{
trova = false;
System.Console.WriteLine("Cognome non Presente\n\t\tRiprovare...................");
}
}
int trov = (int)tmp;
this.cognome[trov] = null;
this.nome[trov] = null;
return "";
}
Ma sto prog come logica regge?
Kleidemos
24-02-2003, 18:55
ap
Scusa ma gli errori che ti indica il compilatore non ti suggeriscono proprio nulla?
Kleidemos
25-02-2003, 06:51
Originally posted by "atragon"
Scusa ma gli errori che ti indica il compilatore non ti suggeriscono proprio nulla?
Si ma a me un if tra l'object e l'int serve :D ................... o hai un modo per risolverlo?
Kleidemos
25-02-2003, 07:02
al momento per gli errori ho corretto.................mo vediamo se fa quello che devo fare:
public string rimuovi(string num)
{
int numero = Convert.ToInt32(num);
for(int i=0;i<this.nome.Count;i++)
{
if(id[i].Equals(numero))
{
tmp = numero.ToString();
return tmp;
}
else
{
System.Console.WriteLine("Cognome non Presente\n\t\tRiprovare..");
}
}
int trov = Convert.ToInt32(tmp);
this.id[trov] = null;
this.cognome[trov] = null;
this.nome[trov] = null;
return "";
}
Mi spighi perchè sei fissato con le stringhe ?!!?!? Fai tutte quelle conversioni string->intero->stringa...
Lavora sugli interi e poi fai le conversioni in stringa solo al momento del passaggio della variabile alla funzione :)
Kleidemos
25-02-2003, 08:31
Originally posted by "cionci"
Mi spighi perchè sei fissato con le stringhe ?!!?!? Fai tutte quelle conversioni string->intero->stringa...
Lavora sugli interi e poi fai le conversioni in stringa solo al momento del passaggio della variabile alla funzione :)
cioe?
Come funzione va o è tutto cannato??
Ha una sua logica?
La funzione va...ma direi che sia meglio lavorare sugli interi ;)
Il prametro che passi alla funzione (num) da dove lo prendi ? Dall'input ?
Kleidemos
25-02-2003, 09:41
lo prende da una lettura su console
Davvero la funzione ha una logica?
Perchè non usi il metodo Remove, per eliminare l'elemento dall'ArrayList?
Riguardandola non mi tornano diverse cose...a parte il fatto che non ti conviene lavorare con le stringhe...
Ad esempio scrivi che il cognome non è presente all'interno del ciclo for...ma ti puoi accorgere che il cognome non è presento solo alla fine del ciclo for...
public int rimuovi(int num)
{
for(int i=0;i<this.nome.Count;i++)
{
if(id[i].Equals(num))
return i;
}
//se sono fuori dal ciclo allora significa che non è stato trovato
System.Console.WriteLine("Cognome non presente\n\t\tRiprovare..");
//tmp qui non ha un valore valido, poi a cosa servirebbe fare una cosa del genere ?
//int trov = Convert.ToInt32(tmp);
//this.id[trov] = null;
//this.cognome[trov] = null;
//this.nome[trov] = null;
return -1; //oppure lanci una eccezione
}
Kleidemos
25-02-2003, 09:54
Originally posted by "tas"
Perchè non usi il metodo Remove, per eliminare l'elemento dall'ArrayList?
perche nn mi piacie usare sempre cose gia fatte :muro:
Aspetta...ora ho cpito il senso della tua funzione...
Se usi il return ti esce dal ciclo appena trova l'indice...ma in questo modo ti esce anche dalla funzione...
Se vuoi fare le cose bene allora devi fare così :
public int rimuovi(int num)
{
for(int i=0;i<this.nome.Count;i++)
{
if(id[i].Equals(num))
{
//attento che in questo modo non deallochi comunque la memoria
this.id[i] = null;
this.cognome[i] = null;
this.nome[i] = null;
return i;
}
}
//se sono fuori dal ciclo allora significa che non è stato trovato
System.Console.WriteLine("Cognome non presente\n\t\tRiprovare..");
return -1; //oppure lanci una eccezione
}
Kleidemos
25-02-2003, 10:02
ti sembra che sti migliorando?
:muro: :muro: :muro:
Il problema è che la funzione andrà bene la prima volta che la chiami, le chiamate seguenti potrebbero invece generarti una eccezione (NullReferenceException).
Ti spiego meglio: supponi di rimuovere, su un elenco di 10 nomi, il numero 4. In questa parte hai scritto:
this.id[trov] = null;
this.cognome[trov] = null;
this.nome[trov] = null;
Hai messo a Null degli elementi, però quel particolare indice dall'array esiste ancora.
In una successiva chiamata alla funzione, che cerca di eliminare per esempio l'elemento 7, il ciclo For passerà ancora sulla posizione 4:
if(id[i].Equals(num))
ma qui parte l'eccezione NullReferenceException, in quanto id[4] è Null.
Kleidemos
25-02-2003, 10:18
ottima ossevazione.............e se facessi
this.id[trov].Remove();
this.cognome[trov].Remove();
this.nome[trov].Remove();
Mi sa che hai fatto un po' di confusione: nel titolo della discussione hai detto di usare ArrayList, mentre nel codice dimostri di usare array semplici (me ne sono accorto per la presenza della funzione Equals). Puoi confermare? Puoi postare il codice dove hai dichiarato id, cognome e nome?
Kleidemos
25-02-2003, 10:38
using System;
using System.Collections;
namespace Gestione_Persone
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Princ
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
string num_id,nome, cognome;
string control = null;
do{
Console.WriteLine("Menu:\nI -> inserire\nC -> cancellare\nX -> Uscire\n");
string cosa = Console.ReadLine();
Console.WriteLine("\n");
switch(cosa)
{
case "I":
case "i":
Util util = new Util();
Console.WriteLine("Inserisci il nome:\n");
nome = Console.ReadLine();
Console.WriteLine("\n");
Console.WriteLine("Inserisci il cognome:\n");
cognome = Console.ReadLine();
util.aggiungi(nome, cognome);
Console.WriteLine("\n");
Console.WriteLine("Che vuoi fare ora?\n");
control = Console.ReadLine();
Console.WriteLine("\n");
break;
case "C":
case "c":
Util utils = new Util();
Console.WriteLine("Inserisci l'ID:\n");
num_id = Console.ReadLine();
num_id2 = Convert.ToInt32(num_id);
utils.rimuovi(num_id2);
Console.WriteLine("\n");
Console.WriteLine("Che vuoi fare ora?\n");
control = Console.ReadLine();
Console.WriteLine("\n");
break;
case "X":
case "x":
break;
}
}while(control != "X");
}
}
/// <summary>
/// Summary description for Agenda.
/// </summary>
public class Util
{
/// <summary>
/// La variabili
/// </summary>
public ArrayList id = new ArrayList();
public ArrayList nome = new ArrayList();
public ArrayList cognome = new ArrayList();
public string tmp;
public Util()
{
this.nome = null;
this.cognome = null;
this.id = null;
}
/// <summary>
/// Aggiunge
/// </summary>
/// <param name="nm">Il nome</param>
/// <param name="cgn">Il Cognome</param>
public void aggiungi(object nm, object cgn)
{
try
{
this.nome.Add(nm);
this.cognome.Add(cgn);
this.id.Add(1);
}
catch(System.NullReferenceException MyExceptions)
{
Console.WriteLine(MyExceptions);
}
}
/// <summary>
/// Toglie
/// </summary>
/// <param name="num">Il numero</param>
/// <returns></returns>
public int rimuovi(int num)
{
for(int i=0;i<this.nome.Count;i++)
{
if(id[i].Equals(num))
{
//attento che in questo modo non deallochi comunque la memoria
this.id[i] = null;
this.cognome[i] = null;
this.nome[i] = null;
return i;
}
}
//se sono fuori dal ciclo allora significa che non è stato trovato
System.Console.WriteLine("Cognome non presente\n\t\tRiprovare..");
return -1; //oppure lanci una eccezione
}
}
}
Prova così:
using System;
using System.Collections;
namespace Gestione_Persone
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Princ
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
string num_id, nome, cognome;
int num_id2;
bool control = false;
string cosa;
Util util = new Util();
do
{
Console.WriteLine("Menu:\nI -> inserire\nC -> cancellare\nX -> Uscire\n");
cosa = Console.ReadLine();
Console.WriteLine("\n");
switch(cosa)
{
case "I":
case "i":
Console.Write("Inserisci il nome:");
nome = Console.ReadLine();
Console.Write("Inserisci il cognome:");
cognome = Console.ReadLine();
Console.Write("\n");
util.aggiungi(nome, cognome);
break;
case "C":
case "c":
Console.Write("Inserisci l'ID:");
num_id = Console.ReadLine();
num_id2 = Convert.ToInt32(num_id);
util.rimuovi(num_id2);
break;
case "X":
case "x":
control = true;
break;
}
}while(control != true);
}
}
/// <summary>
/// Summary description for Agenda.
/// </summary>
public class Util
{
/// <summary>
/// La variabili
/// </summary>
private ArrayList id;
private ArrayList nome;
private ArrayList cognome;
private int progressivo;
public Util()
{
this.nome = new ArrayList();
this.cognome = new ArrayList();
this.id = new ArrayList();
progressivo = 0;
}
/// <summary>
/// Aggiunge
/// </summary>
/// <param name="nm">Il nome</param>
/// <param name="cgn">Il Cognome</param>
public void aggiungi(string nm, string cgn)
{
try
{
this.nome.Add(nm);
this.cognome.Add(cgn);
this.id.Add(++progressivo);
}
catch(System.NullReferenceException MyExceptions)
{
Console.WriteLine(MyExceptions);
}
}
/// <summary>
/// Toglie
/// </summary>
/// <param name="num">Il numero</param>
/// <returns></returns>
public int rimuovi(int num)
{
for(int i=0; i<this.nome.Count; i++)
{
if(id[i].Equals(num))
{
this.id.RemoveAt(i);
this.cognome.RemoveAt(i);
this.nome.RemoveAt(i);
return i;
}
}
//se sono fuori dal ciclo allora significa che non è stato trovato
System.Console.WriteLine("Cognome non presente, riprovare...");
return -1; //oppure lanci una eccezione
}
}
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.