buenísimo!! muchas gracias From: Leonardo Micheloni Sent: Monday, February 17, 2014 9:33 PM To: puntonet@mug.org.ar Subject: [puntonet] equals
Gabriel tiene razón, para .net ambos objetos son referencias (es decir un puntero a un lugar en la memoria) cuando hacés equals se comparan las posiciones y siempre te va a dar que son diferentes (esto no pasa con tipos por valor como enteros por ejemplo en donde la variable tiene el valor y no un referencia) Una lisda forma de solucionarlo es implementando tu propia lista, creando una clase que implemente IList<string> así: class MiLista : IList<string> { private List<string> lista = new List<string>(); public int IndexOf(string item) { return this.lista.IndexOf(item); } public void Insert(int index, string item) { this.lista.Insert(index, item); } public void RemoveAt(int index) { this.lista.RemoveAt(index); } public string this[int index] { get { return this.lista[index]; } set { this.lista[index] = value; } } public void Add(string item) { this.lista.Add(item); } public void Clear() { this.lista.Clear(); } public bool Contains(string item) { return this.lista.Contains(item); } public void CopyTo(string[] array, int arrayIndex) { this.lista.CopyTo(array, arrayIndex); } public int Count { get { return this.lista.Count; } } public bool IsReadOnly { get { return false; } } public bool Remove(string item) { return this.lista.Remove(item); } public IEnumerator<string> GetEnumerator() { return this.lista.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.lista.GetEnumerator(); } // acá se realiza la verdadera comparación public override bool Equals(object obj) { var equals = false; var otralista = (IList<string>) obj; if(otralista.Count!=this.lista.Count) return false; for (var i = 0; i< this.lista.Count; i++) { var item = this.lista[i]; if(!item.Equals(otralista[i])) return false; } return true; } } Es bastante código pero es un wrapper que solamente sobre-escribe el método equals y compara los strings uno por uno, si modificás tu código para que use la lista nueva vas a ver que funciona como creo que vos esperás IList<string> lista1 = new MiLista(); IList<string> lista2 = new MiLista(); for (int i = 0; i <= 10; i ++) { lista1.Add(i.ToString()); lista2.Add(i.ToString()); } if (lista1.Equals(lista2)) { Console.Write("iguales"); } else { Console.Write("dif"); } saludos 2014-02-17 19:01 GMT-03:00 Gabriel Osorio <ge.ex...@gmail.com>: Mira: http://msdn.microsoft.com/es-es/library/bsc2ak47(v=vs.110).aspx En tu caso está comparando las dos referencias. Al ser objetos diferentes, el resultado es falso. El 17 de febrero de 2014, 15:57, Ing. Roxana Leituz <roxanalei...@yahoo.com.ar> escribió: consulta.. porque no entiendo.., tengo dos listas genéricas de string.. uso equals para compararlas, le cargo los mismos datos..pero me da falso?? no debería comparar por valor?? ejemplo List<string> lista1 = new List<string>(); List<string> lista2 = new List<string>(); for (int i = int.Parse(PuntNumI.Text); i <= int.Parse(PuntNumFin.Text); i += int.Parse(PuntNumInt.Text)) { lista1.Add(i.ToString()); lista2.Add(i.ToString()); } if (lista1.Equals(lista2)) { Response.Write("iguales"); } else Response.Write("dif"); primero eran valores iguales de dos controles diferentes..dije bueno..que hago mal..entonces probé con los mismos... y false siempre, en que estoy metiendo la pata? o es que solo compara por referencia?? muchas gracias!! -- Leonardo Micheloni @leomicheloni
<<wlEmoticon-smilewithtongueout[1].png>>