Tengo un código simple que estoy luchando por simplificar para mi ternario.

Obtuve un método que es bastante largo y quiero meterlo en una variable para que sea más fácil de leer, pero no estoy seguro de cómo hacerlo.

Mi código se ve así actualmente:

_gridPositionLastFrame = _buildState == BuildState.None ? Grids.Snap(worldPosition,1,plane); : Grids.Snap(worldPosition,4,plane);

Me gustaría acortarlo más como:

//Set the functions in variables here first some how rather than compute them
//var snapOne as Grids.Snap(worldPosition,1,plane);
//var snapFour as Grids.Snap(worldPosition,4,plane);
_gridPositionLastFrame = _buildState == BuildState.None ? SnapOne() : SnapFour();

Es posible ? Realmente ayudaría a que mi guión fuera mucho más limpio en algunas partes, pero no sé la forma correcta de escribirlo.

c#
0
WDUK 8 sep. 2018 a las 02:58

3 respuestas

La mejor respuesta

Estás cerca:

var snapOne as Grids.Snap(worldPosition, 1, plane);
var snapFour as Grids.Snap(worldPosition, 4, plane);
_gridPositionLastFrame = _buildState == BuildState.None ? snapOne : snapFour;

... pero Grids.Snap se llama dos veces, incluso si no se usa una de esas llamadas. Eso incluso podría causar efectos secundarios en el caso de algunos métodos. Recomiendo extraer la parte que varía en su lugar:

var snapSize = _buildState == BuildState.None ? 1 : 4;
_gridPositionLastFrame = Grids.Snap(worldPosition, snapSize, plane);

Esto requiere menos repetición de lógica.

4
AustinWBryan 8 sep. 2018 a las 01:03

También puede hacer esto (para los métodos de tipo ref y out, esto no funcionará)

_gridPositionLastFrame = Grids.Snap(worldPosition,  _buildState == BuildState.None ? 1: 4 ,plane);
0
Gauravsa 8 sep. 2018 a las 01:53

No sé la firma de su función GridSnap, pero voy a suponer que se ve así:

TR GridSnap(T1, int, T2)

Entonces, podría corregir el código que se ve así:

Func<TR> SnapOne = () => Grids.Snap(worldPosition, 1, plane);
Func<TR> SnapFour = () => Grids.Snap(worldPosition, 4, plane);

Justo por encima de tu ternario.

2
Flydog57 8 sep. 2018 a las 00:09