Estamos inspirados hoy ;-)
2014-02-18 13:53 GMT+11:00 Carlos Peix <peix-lis...@praxia.com.ar>: > Antes que nada una advertencia: Siempre que se hace una implementación > custom de Equals() debe hacerse una implementacion custom coherente de > GetHashCode(). El porqué de esto y que significa coherente es material para > otro mail pero encontrarán mucho en Internet. > > Una aclaracion sobre lo que dice Leo y lo que sugeri en mi mail (heredar o > componer). > > Si heredas (o implementas interfaz, en este caso es lo mismo) te arrastras > todos los metodos de tu clase heredada. Puede que esto sea lo que necesitas > o no. Si no necesitas toda esa interfaz de IList<T>, entonces podrias hacer > algo asi como: > > class MiLista *// Notese que no hereda de ninguna otra clase* > { > private List<string> lista = new List<string>(); > > 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 int Count > { > get { return this.lista.Count; } > } > > // 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; > } > } > > Noten que hay muchos menos metodos, solo los necesarios para tu clase. > > ---------------------------------- > Carlos Peix > > > > 2014-02-17 18:33 GMT-06:00 Leonardo Micheloni < > leonardogabrielmichel...@gmail.com>: > > 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..[image: Lengua fuera], 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 >> > >
<<inline: wlEmoticon-smilewithtongueout[1].png>>