Estoy usando .toString() dentro de linq: ¿almacena en caché el valor convertido o lo convierte repetidamente en cada paso del ciclo?

Resuelto Diana Gumar asked hace 7 meses • 1 respuestas

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:

ingrese la descripción de la imagen aquí

¿Dónde puedo comprobar este tipo de comportamiento para estar seguro?

Diana Gumar avatar Feb 16 '24 20:02 Diana Gumar
Aceptado

Hice una prueba y parece solicitar ToStringcada 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);

datacontení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 Wherees un bucle y se ejecuta una instrucción para cada objeto. ToStringTambién es una instrucción y el tiempo de ejecución debe ejecutarla cada vez ya que el valor de retorno podría cambiar.

Oybek avatar Feb 16 '2024 14:02 Oybek