2016-10-26 6 views
1

Ich möchte ein Wörterbuch erstellen und füllen Sie es auf eine bestimmte Weise.Wie kann ich Funktion als Wert im Wörterbuch verwenden? (C#)

public struct Position 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
    public char Orientation { get; set; } 
} 

public Dictionary<Position, Position> ChangePosition; 

die Orientierung kann 'N', 'S', 'E' sein, 'W' bedeutet, Norden, Süden, ...

, wenn der erste Schlüssel ist X, Y, 'N ' ---> der Wert sein sollte X, Y + 1, 'N'

So das Wörterbuch nächste Position des Elements Prädikat kann basierend auf aktueller Position und Richtung zu bewegen.

Wie kann ich dieses Wörterbuch füllen? Oder gibt es einen anderen besseren Weg, es zu implementieren?

Jede Hilfe wäre willkommen.

aktualisieren

ich diese Lösung gefunden, aber ich denke, vielleicht so etwas wie Action<> kann es besser machen:

ChangePosition= new Dictionary<char, Func<Position, Position>> 
{ 
    {'N', pos => new Position {X = pos.X, Y = pos.Y + 1, Orientation = pos.Orientation}}, 
    {'E', pos => new Position {X = pos.X+1, Y = pos.Y , Orientation = pos.Orientation}}, 
    {'W', pos => new Position {X = pos.X-1, Y = pos.Y, Orientation = pos.Orientation}}, 
    {'S', pos => new Position {X = pos.X, Y = pos.Y - 1, Orientation = pos.Orientation}}, 
}; 
+0

Der Algorithmus ist hier sowohl trivial als auch billig. Warum sollten Sie eine Nachschlagelösung wählen? –

+0

@J ... was ist dein Vorschlag bitte? –

+0

Das Ausfüllen von 4 Werten in einem Wörterbuch sollte nicht * zu * hart sein ... Was genau versuchen Sie in diesen 4 Zeilen zu vereinfachen? –

Antwort

0

ich ein Objekt sehr empfehlen und die Kompassrichtung Zeichen machen Position ('N ',' E ',' W ',' S ') enums. Die resultierende Schnittstelle ist viel sauberer und intuitiver.

using System; 
using System.Collections.Generic; 

namespace DictionaryOfFunctions_StackOverflow 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Position start = new Position() 
      { 
       X = 0, 
       Y = 0, 
       Orientation = CompassDirection.North 
      }; 
      start.Move(CompassDirection.North, 5); 
      start.Print(); // X: 0 Y: 5 Orientation: North 
      start.Move(CompassDirection.SouthWest, 5); 
      start.Print(); // X: -5 Y: 0 Orientation: SouthWest 
      start.Move(CompassDirection.East); 
      start.Print(); // X: -5 Y: 0 Orientation: East 
      start.Move(dX: 5, dY: 1, newDirection: CompassDirection.West); 
      start.Print(); // X: 0 Y: 1 Orientation: West 
      start.Move(dY: -1, newDirection: CompassDirection.North); 
      start.Print(); // X: 0 Y: 0 Orientation: North 
      Console.ReadKey(); 
     } 
    } 

    public enum CompassDirection 
    { 
     NorthWest, 
     North, 
     NorthEast, 
     East, 
     SouthEast, 
     South, 
     SouthWest, 
     West 
    } 

    public class Position 
    { 
     public CompassDirection Orientation { get; set; } 
     public int X { get; set; } 
     public int Y { get; set; } 

     public void Move(int dX = 0, int dY = 0, CompassDirection? newDirection = null) 
     { 
      X += dX; 
      Y += dY; 
      Orientation = newDirection.HasValue ? newDirection.Value : Orientation; 
     } 

     public void Move(CompassDirection newDirection, int distance = 0) 
     { 
      var movement = new Dictionary<CompassDirection, Action> 
      { 
       {CompassDirection.NorthWest,() => Move(dY: 1, dX: -1)}, 
       {CompassDirection.North,() => Move(dY: 1)}, 
       {CompassDirection.NorthEast,() => Move(dY: 1, dX: 1)}, 
       {CompassDirection.East,() => Move(dX: 1)}, 
       {CompassDirection.SouthEast,() => Move(dY: -1, dX: 1)}, 
       {CompassDirection.South,() => Move(dY: -1)}, 
       {CompassDirection.SouthWest,() => Move(dY: -1, dX: -1)}, 
       {CompassDirection.West,() => Move(dX: -1)} 
      }; 
      Orientation = newDirection; 
      for (int i=0; i< distance; i++) 
      { 
       Action changePosition = movement[Orientation]; 
       changePosition(); 
      } 
     } 
    } 

    public static class ExtensionMethods 
    { 
     public static void Print(this Position pos) 
     { 
      string display = $"X: {pos.X} Y: {pos.Y} Orientation: {pos.Orientation}"; 
      Console.WriteLine(display); 
     } 
    } 
} 
+0

Es kann eine Lösung sein. Vielen Dank –

Verwandte Themen