【问题标题】:Using structs for Range variable type将结构用于 Range 变量类型
【发布时间】:2012-07-27 20:27:55
【问题描述】:

我正在尝试为一个范围变量(最小值、最大值)创建一个结构,其中包含几个成员和一个知道值之间是否存在的方法。

现在我的结构是这样的:

public struct NumRange
{
    float maximum;
    float minimum;

    public NumRange(float min, float max) 
    {
        this.maximum = max;
        this.minimum = min;
    }

    public bool IsBetween(float value)
    {
        if (value < maximum && value > minimum)
            return true;

        return false;
    }
}

我希望能够通过

制作数字范围
NumRange test = new NumRange(15, 20);

制作这个范围变量类型的重点是制作一个地图键字典,如下所示:

public Dictionary<NumRange, Color> mapKey = new Dictionary<NumRange, Color>();
NumRange test = new NumRange(15, 20);
mapKey.Add(test, Color.Orange);

这是最好的方法吗?当我尝试向 mapKey 添加一些东西时,它也不喜欢。表示有',' ')' '('等无效标记

【问题讨论】:

  • 你的结构看起来不错,但请记住,浮动可能会以令人惊讶的方式进行比较。使用泛型而不是重用整数的浮点范围可以获得更好的性能:NumRange&lt;T&gt; { T min; T max;...
  • 遵循标准 C# 大小写和命名准则:msdn.microsoft.com/en-us/library/ms229043.aspx
  • @JonofAllTrades 如何使用通用 T?我要替换所有的 float 实例还是???
  • @Jesse 我更改了一些,但如果您发现任何其他错误,请告诉我,这样我就不会继续了。
  • 另一种可能性是使结构不可变,即将readonly 放在您的成员minimummaximum 上。这 a) 表示意图:此范围始终适用于这些值,并且 b) 可能允许编译器和/或 JITter 优化事物。

标签: c# dictionary struct variable-types


【解决方案1】:

除非您要查找的值数量有限,否则字典可能不是最佳选择。看起来您正在将值范围映射到颜色以应用于高度图。这个类的存根允许您这样做,但请注意,它不支持从颜色 A 到颜色 B 的混合。

class RangeMap<T>
{
    private SortedList<float, T>  _values;

    public RangeMap()
    {
        _values = new SortedList<float, T>();
    }

    public void AddPoint(float max, T value)
    {
        _values[max] = value;
    }

    public T GetValue(float point)
    {
        if (_values.ContainsKey(point)) return _values[point];

        return (from kvp in _values where kvp.Key > point select kvp.Value)
               .FirstOrDefault();
    }
}   
var  map = new RangeMap<Color>();
map.AddPoint(0.0F, Color.Red);
map.AddPoint(0.5F, Color.Green);
map.AddPoint(1.0F, Color.Blue);

Console.WriteLine(map.GetValue(-0.25F).Name);
Console.WriteLine(map.GetValue( 0.25F).Name);
Console.WriteLine(map.GetValue( 0.75F).Name);
Console.WriteLine(map.GetValue( 1.25F).Name);

输出:红、绿、蓝、空结构。

【讨论】:

  • @FredrikSundmyhr:为了符合您的个人风格(括号缩进)而更改某人的代码是不礼貌的。请节省材料更改的时间。见元:meta.stackexchange.com/questions/133224/…
  • 您的代码不必要地缩进了四个额外的空格。一直在发生,因此删除缩进是一种常见的编辑,绝对值得。确保所有代码都可见,而无需水平或垂直滚动​​。
  • @Will:这将是一个值得的改变。然而,根据编辑历史,他的更改只是将支撑样式从 Whitesmiths 更改为 Allman,并将道具移到构造函数之前:充其量是浪费时间,并邀请宗教战争。
  • 哈!哦,我什至没有注意到这一点。对我来说,这看起来像是严重缩进的代码。这是一个常见的现象。没把它当成一种风格。那好吧。无论如何,当圣经(框架设计指南)对这个主题非常清楚时,就没有必要进行宗教战争了。
猜你喜欢
  • 2013-08-15
  • 2022-01-06
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 2019-04-26
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多