Estoy usando .toString() dentro de linq: ¿almacena en caché el valor convertido o lo convierte repetidamente en cada paso del ciclo?
El ejemplo de código:
var id = 2;
var result = data.Where(x => x.SomeField.Any(p => p.Id == id.ToString()))
Parece que está convirtiendo int en cadena en cada paso del ciclo:
¿Dónde puedo comprobar este tipo de comportamiento para estar seguro?
Aceptado
Hice una prueba y parece solicitar ToString
cada elemento de los datos. Modifiqué el código y usé una clase especial a continuación.
public class SpecialInt
{
public int Value { get; set; }
public static implicit operator int(SpecialInt x)
{
return x.Value;
}
public override string ToString()
{
Console.WriteLine("ToString is called");
return Value.ToString();
}
}
Luego ejecuté el siguiente código
var id = new SpecialInt { Value = 2 };
var result = data.Where(x => x.SomeField.Any(p => p.Id == id.ToString())).ToList();
Console.WriteLine(result.Count);
data
contenía dos objetos que cumplían con el predicado.
La salida fue
ToString is called
ToString is called
2
El comportamiento anterior tiene sentido. Básicamente Where
es un bucle y se ejecuta una instrucción para cada objeto. ToString
También es una instrucción y el tiempo de ejecución debe ejecutarla cada vez ya que el valor de retorno podría cambiar.