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>>

Reply via email to