2016-10-26 1 views
1

辞書を作成して特定の方法で入力したいと考えています。辞書でFunction as valueを使用するにはどうすればよいですか? (C#)

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

public Dictionary<Position, Position> ChangePosition; 

オリエンテーションが 'E'、 'W' の北、南を意味し、 'S'、 'N' することができ...

最初のキーがX、Y、 'Nです' --->値はX、Y + 1、' N '

である必要があります。したがって、辞書は、現在の位置と移動方向に基づいてアイテムの次の位置を述語できます。

この辞書にはどのような記入方法がありますか? それを実装する他の方法がありますか?

ご協力いただければ幸いです。

更新

私は、しかし、私は多分Action<>のようなものは、それを改善することができますね、この解決策を見つけた:

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

ここのアルゴリズムは簡単で安価です。なぜルックアップソリューションを選択するのですか? –

+0

@J ...あなたの提案はどうしますか? –

+0

辞書に4つの値を記入するのは難しいことではありません...その4行で簡単に何をしようとしていますか? –

答えて

0

私は非常に対象とコンパス方向文字( 'Nポジションを作るお勧めします'、' E '、' W '、' S ')の列挙型を返します。結果として得られるインターフェースは、よりクリーンで直感的です。

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

これは1つの解決策になります。ありがとうございました –

関連する問題