avrei usato un tipo combinato e ti dirò perché: perché il calcolo di un valore dovrebbe restituire il valore, non mutare un gruppo di variabili. La modifica di un gruppo di variabili non viene ridimensionata una volta che ne è necessario più di uno modificato. Si supponga di voler un migliaio di queste cose:
IEnumerable<Ray> rays = GetAThousandRays();
var intersections = from ray in rays
where Intersect(ray, out distance, out normal)
orderby distance ...
L'esecuzione della query è ora più volte mutando le stesse due variabili. Stai ordinando in base a un valore che viene modificato. Questo è un casino. Non fare domande che mutano le cose; è molto confuso.
Quello che vuoi è:
var intersections = from ray in rays
let intersection = Intersect(ray)
where intersection.Intersects
orderby intersection.Distance ...
No mutazione; manipolare una sequenza di valori come valori non come variabili.
anche io sarei propenso a forse sbarazzarsi di quella bandiera booleano, e rendere il valore di una struct immutabile:
// returns null if there is no intersection
Intersection? Intersect(Ray ray) { ... }
struct Intersection
{
public double Distance { get; private set; }
public Vector3 Normal { get; private set; }
public Intersection(double distance, Vector3 normal) : this()
{
this.Normal = normal;
this.Distance = distance;
}
}
fonte
2011-03-10 22:14:54
Anche le tuple sono belle se non vuoi creare un tipo unico ... non abusarne ovviamente ;-) – Amir