C# 映射罗盘点和搜索

标签 c# .net data-structures

我正在研究存储结构并使其易于搜索返回键的单个值的最佳方式。这是伪数据结构:

N = 0
NNE = 1 .. 44
NE = 45
ENE = 46 .. 89
E = 90
ESE = 91 .. 134
SE = 135
SSE = 136 .. 179
S = 180
SSW = 181 .. 224
SW = 225
WSW = 226 .. 269
W = 270
WNW = 271 .. 314
NW = 315
NNW = 316 .. 359

我希望能够以一种我可以这样说的方式存储这些值:

给我给定值的键值。因此,如果我需要 193 的 key ,我会被退回 SSW。我一直在尝试不同的想法,但想看看你们的想法。

我以风向为例,但数据可以是任何数据。

数据结构将被编译并且永远不会改变。

谢谢。

最佳答案

您可以创建一个类来保存“键”(我认为“名称”是更合适的描述符,但您可以随意调用它)和罗盘上的值范围,例如:

public class CompassRange
{
   public string Name { get; set; }
   public int Min { get; set; }
   public int Max { get; set; }
}

然后,创建创建静态 List<CompassRange> 的类并适本地填充它:

public class Compass
{
    private static List<CompassRange> _ranges;

    static Compass()
    {
       _ranges = new List<CompassRange>()
       {
          // Add CompassRange objects here
       };
    }
}

最后,您可以向此类添加一个方法来搜索 List对于适当的范围并返回名称:

public static string GetName(int direction)
{
    direction = direction % 360;
    return _ranges.First(x => x.Min <= direction && x.Max >= direction).Name;
}

您甚至可以使用内置的 System.Tuple<string, int, int>输入而不是 CompassRange ,尽管这牺牲了这段代码的一些清晰度。

关于C# 映射罗盘点和搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7350969/

相关文章:

c# - "Invalid provider type specified"尝试加载证书私钥时出现CryptographicException

c# - 与 VB.NET 相比,为什么 C# IntelliSense 延迟了?

c - LinkedList - C 中的类型 - 访问函数

c - 树的意外预序遍历

c++ - 如何实现一个在一种情况下具有明显不同实现的类?

c# - 如何用 MVC ActionFilter(或其他东西)替换基本 Controller ?

c# - 为什么 MaxId 函数在 xml 中总是返回 9?

c# - 写入使用 AsciiEncoding.GetBytes 和 Convert.FromBase64String 解码的字节时 FileStream.Write 中的性能问题

c# - 如何避免在加密和解密过程中使用额外的内存?

.net - ASP.NET MVC 引用问题?