2017-10-14 3 views
0

Alle Werte liegen im Bereich von -100.0f zu 100.0fC# Finden 2 stärkste Werte von 4 max/min Auswahl

public float happysad = 0.0f; 
public float passiveagressive = 0.0f; 
public float friendenemy = 0.0f; 
public float weakstrong = 0.0f; 

void GetStrongestTwo() { 
    /* Work out the 2 most extreme values 
    if (happysad > 0){ 
      sad is the strongest 
    } 
    if (happysad < 0){ 
      sad is the strongest 
    } 
    Need to do this for all then work out the two that have the largest (either positive or negative value) 
    */ 
} 

ich versucht habe, konstant, wenn Aussagen, aber mit meinem Verständnis von max und min soll es eine sein einfacherer Weg. Meine Versuche haben zu 24 if-Anweisungen geführt. Ein alternativer Weg wäre, die Werte zu trennen.

public float happy = 0.0f; 
public float sad = 0.0f; 
public float passive = 0.0f; 
public float agressive = 0.0f; 
public float friend = 0.0f; 
public float enemy = 0.0f; 
public float weak = 0.0f; 
public float strong = 0.0f; 

Meine Frage ist, was wäre der beste Ansatz für diese Herausforderung? Wenn eine Codierungsmethode existiert und ich nur mehr Forschung benötige, würde ich einen Push in die richtige Richtung begrüßen, oder wenn die zweite Lösung praktikabler ist, werde ich sie später in meinem Code kompensieren. Da die Werte gegensätzlich sind, würde ich eher einen Wert von 1,0 f hinzufügen oder entfernen müssen, jedes Mal wenn ein Ereignis eintritt, das das Element emotion betrifft.

Antwort

2

Statt die vielen Variablen verwenden und eine Menge, wenn die, eine einfache Klasse mit Namen und Wert schaffen, wie:

public class GameInfo 
{ 
    public string name; 
    public float value; 
    public GameInfo(string name, float value) 
    { 
    this.name = name; 
    this.value = value; 
    } 
} 

Jetzt können Sie leicht haben eine Liste mit diesen Werten sortiert. So:

List<GameInfo> info = new List<GameInfo>(); 

    // please add the other info you wish 
    info.Add(new GameInfo("happy", 5.0f)); 
    info.Add(new GameInfo("sad", 15.0f)); 
    info.Add(new GameInfo("passive", 4.0f)); 
    info.Add(new GameInfo("agressive", 35.0f)); 
    // ... 

    // sort the list (I used linq but you could use other methods) 
    List<GameInfo> sortedInfo = info.OrderByDescending(o => o.value).ToList(); 

    foreach (GameInfo i in sortedInfo) 
    { 
     Console.WriteLine(i.name + ", " + i.value); 
    } 

Und das ist es.

+0

Bravo, das ist so elegant. Diese Methode ist viel effizienter als die Art, wie ich das Problem betrachtete. – SystemX17

0

Mit "stärkste", meinst du, du versuchst, Werte mit der höchsten Größenordnung zu finden? Und brauchen Sie nur die Werte oder die Namen der Variablen?

Wenn Sie nur die Werte benötigen, können Sie tun:

float happysad = -10.0f; 
float passiveaggressive = 5.0f; 
float friendenemy = 2.0f; 
float weakstrong = 7.0f; 

var twoStrongest = 
    new [] {happysad, passiveaggressive, friendenemy, weakstrong} 
     .Select(stat => new {Value = stat, Magnitude = Math.Abs(stat)}) 
     .OrderByDescending(statWithMagnitude => statWithMagnitude.Magnitude) 
     .Select(statWithMagnitude => statWithMagnitude.Value) 
     .Take(2).ToList(); 

Was die oben tut: Karten jeder Schwimmer in ein temporäres Objekt, das die Größe jeder stat hat, sortiert sie nach Größe, dann wandelt sie zurück zum ursprünglichen Float und nimmt die ersten beiden Werte.

Auf der anderen Seite, wenn Sie die Namen finden möchten, können Sie den Namen/Stat-Mapping in einem Wörterbuch gespeichert werden:

var stats = new Dictionary<string, float> { 
    {"happysad", -10.0f}, 
    {"passiveaggressive", -6.0f}, 
    {"friendenemy", 8.0f}, 
    {"weakstrong", 3.0f} 
}; 

var twoStrongest = stats 
    .Select(entry => new {Entry = entry, Magnitude = Math.Abs(entry.Value)}) 
    .OrderByDescending(statWithMagnitude => statWithMagnitude.Magnitude) 
    .Select(statWithMagnitude => statWithMagnitude.Entry) 
    .Take(2).ToList(); 

Above gibt eine Liste von Schlüssel/Wert-Paare den Namen enthält, und die Originalwert.