que ordenar una lista con mi propia IComparer y esto funciona bien cuando se ejecuta la aplicación (juego de XNA) durante más de una hora. Pero entonces, de repente, a veces me sale el siguiente error al invocar la clase método con mi costumbre Comparer:¿Por qué obtengo un System.ArgumentException cuando se invoca Sort (IComparer) en una lista?
An unhandled exception of type 'System.ArgumentException' occured in mscorlib.dll
Additional Information: ArgumentException
Ésta es la línea en la que se produce la excepción:
List<Continent> markets = new List<Continent>();
// filling the markets list ...
markets.Sort(new MarketCostCoverComparer(this));
y este es mi clase que implementa la interfaz IComparer:
class MarketCostCoverComparer : IComparer<Continent> {
private Player player;
public MarketCostCoverComparer(Player player) {
this.player=player;
}
public int Compare(Continent c1, Continent c2) {
if(player.GetCostCovering(c1)<player.GetCostCovering(c2)) {
return +1;
} else if(player.GetCostCovering(c1)==player.GetCostCovering(c2)) {
return 0;
} else {
return -1;
}
}
}
Aquí algunos métodos que están vinculados con el comparador ...:
public float GetCostCovering(Continent continent) {
// cover<1 => bad | cover>1 => good
if(GetOilfieldTheoreticOutput(continent.Type, true)<continent.Economy.CurrentDemand) {
return ((float)((GetOilfieldTheoreticOutput(continent.Type, true)*continent.Economy.CurrentPrice)))/(float)GetOilfieldCosts(continent.Type, true);
} else {
return ((float)((continent.Economy.CurrentDemand*continent.Economy.CurrentPrice)))/(float)GetOilfieldCosts(continent.Type, true);
}
}
public int GetOilfieldTheoreticOutput(ContinentType continent, bool drilled) {
int total = 0;
foreach(Oilfield oilfield in worldmap.Continents[(int)continent].Oilfields) {
if(oilfield.Owner==this && oilfield.Drilled==drilled) {
total+=oilfield.TheoreticOutput;
}
}
return total;
}
public int GetOilfieldCosts(ContinentType continent, bool drilled) {
int total = 0;
foreach(Oilfield oilfield in worldmap.Continents[(int)continent].Oilfields) {
if(oilfield.Owner==this && oilfield.Drilled==drilled) {
total+=oilfield.Costs;
}
}
return total;
}
Aquí la captura de pantalla de la excepción:
Aquí, un vistazo más de cerca de los locales/Pila-Trace (esto es una vieja pantalla, pero voy a tratar de reproducir esta excepción dentro de la próxima hora, para que pueda ampliar la traza):
¿Se puede suministrar el stacktrace de la excepción? –
1) publique la excepción interna, si hay una, o al menos la traza de la pila 2) publique el método GetCostCovering() – Filip
Desafortunadamente no hay ningún rastro de pila, ya que Visual Studio simplemente muestra un cuadro de mensaje con las dos líneas mencionadas anteriormente. Los métodos de GetCostCovering() siguen ... – salocinx