简体   繁体   English

如何在字典中使用Function作为值? (C#)

[英]How can I use Function as value in dictionary? (C#)

I want to create a dictionary and fill it in a specific way. 我想创建一个字典并以特定的方式填充它。

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

public Dictionary<Position, Position> ChangePosition;

the Orientation can be 'N','S','E','W' means North, South ,... 方向可以是'N','S','E','W'表示北,南,......

when the first key is X,Y,'N' ---> the value should be X, Y+1 , 'N' 当第一个键是X,Y,'N' --->值应为X,Y + 1,'N'

So the dictionary can predicate next position of the item based on current position and direction of moving. 因此,字典可以基于当前位置和移动方向来预测项目的下一个位置。

How can I fill this dictionary? 我怎么能填这个字典? Or is there any other better way of implementing it? 或者还有其他更好的方法来实现它吗?

Any help would be appreciated. 任何帮助,将不胜感激。

Update 更新

I found this solution, however I guess maybe something like Action<> can make it better: 我找到了这个解决方案,但是我猜想像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}},
};

I highly recommend making Position an object and the compass direction characters ('N', 'E', 'W', 'S') enums. 我强烈建议将Position定位为对象和指南针方向字符('N','E','W','S')枚举。 The resulting interface is much cleaner, and more intuitive. 生成的界面更清晰,更直观。

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);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM