【问题标题】:How store From-To value and result in an array如何将 From-To 值和结果存储在数组中
【发布时间】:2014-05-20 07:33:16
【问题描述】:

我想将一些带有“fromValue”、“ToValue”、“Info”字段的项目存储在一个数组中,并编写一个例程来搜索“FromValue”和“ToValue”之间的输入“value”并返回“Info”字段.我需要快速可搜索的容器。

FromValue,ToValue,Info   
10,20,TX   
24,56,NY   
input =34 returns NY

谢谢

【问题讨论】:

  • 你的努力在哪里?他们是隐藏的?因为我没有看到他们
  • 为什么不创建一个包含三个字段作为属性的类并将它们放在List<T> 中?然后你就可以实现你的搜索算法了。
  • 你最终可能会得到某种可排序的容器——比如“SortedList”;但这只是没有足够的信息“快速”可能意味着快速检索插入的数据或快速插入新数据 - 算法有所不同。
  • 感谢所有朋友,在我的情况下,搜索速度很快。

标签: c# range containers


【解决方案1】:

好吧,很简单,这个类定义了你的通用范围。

public class Range<TValue, TInfo>
{
    private readonly IComparer<TValue> comparer;

    public Range(IComparer<TValue> comparer)
    {
        this.comparer = comparer;
    }

    public Range(IComparer<TValue> comparer)
        : this(Comparer<TValue>.Default)
    {
    }

    public TValue From { get; set; }
    public TValue To { get; set; }
    public TInfo Info { get; set; }

    public bool InRange(T value, bool inclusive = true)
    {
        var lowerBound = this.comparer.Compare(value, this.From);
        if (lowerBound < 0)
        {
            return false;
        }
        else if (!inclusive && lowerBound == 0)
        {
            return false;
        }

        var upperBound = this.comparer.Compare(value, this.To);
        if (upperBound > 0)
        {
            return false;
        }
        else if (!inclusive && upperBound == 0)
        {
            return false;
        }

        return true;
    }
}

所以,你可以有一个范围序列,

IEnumerable<Range<int, string>> ranges = ...

要查找范围内您可以执行的所有信息值,

var rangesInRange = ranges.Where(r => r.InRange(42)).Select(r => r.Info);

你可以制作一个专门的容器来改进这个操作。

【讨论】:

    【解决方案2】:

    类:

    public class Information
            {
                public int FromValue { get; set; }
                public int ToValue { get; set; }
                public string Info { get; set; }
            }
    

    搜索

       List<Information> Informations = new List<Information>();
        Information infoObj = new Information();
        infoObj.FromValue = 10;
        infoObj.ToValue = 20;
        infoObj.Info = "TX";
        Informations.Add(infoObj);
        Information infoObj2 = new Information();
        infoObj2.FromValue = 24;
        infoObj2.ToValue = 56;
        infoObj2.Info = "NY";
        Informations.Add(infoObj);
        //passing sample input which lies between fromvalue and tovalue
        int sampleInput = 15;
        var result = Informations.FirstOrDefault(x => x.FromValue < sampleInput && sampleInput < x.ToValue);
    

    【讨论】:

    • @MohTarvirdi,如果FromValueToValue 不是int 怎么办?
    • 我的情况是 int,但如果值是字符串,比较代码也应该改变。如果有人概括了与字符串 FromValue 和 ToValue 一起使用的解决方案,并且还以 int 形式返回值,那就太好了
    【解决方案3】:

    这很简单。 在最简单的场景中,只需创建一个类 Item

    public class Item
    {
        public int Id { get; set; }
        public int FromValue { get; set; }
        public int ToValue { get; set; }
        public string Info { get; set; }
    }
    

    有了这个你可以初始化你的List&lt;T&gt;类型的集合

    List<Item> Items = new List<Item>()
    {
        new Item() {Id = 1, FromValue = 10, ToValue = 20, Info = "TX"}
        new Item() {Id = 2, FromValue = 24, ToValue = 56, Info = "NY"}
        new Item() {Id = 3, FromValue = 15, ToValue = 34, Info = "FL"}
    };
    

    有了这个,你可以查询到你的内心内容。

    var itemsFromFlorida = Items.Where(it => it.Info == "FL");
    

    【讨论】:

    • @MohTarvirdi,如果FromValueToValue 不是int 怎么办?
    • Info == "FL" 的例子很简单。但是检查一个值是否在一个范围内会导致大量的重复代码。 (请参阅下面 Sajeetharan 回答的最后一行,看看这有多难看。)我认为,像下面 Jodrell 的面向对象的解决方案更合适。
    • 我并不真正关心范围问题,因为 OP 声明“我需要快速搜索容器。”
    • 我在乎,数据不应该重叠。
    猜你喜欢
    • 2021-12-28
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2020-03-09
    • 2018-10-16
    • 2021-09-24
    • 1970-01-01
    相关资源
    最近更新 更多