c#集合中的范围查找

时间:2015-03-04 15:03:13

标签: c# collections

我搜索过StackOverflow但却找不到我的问题。

我有一些这样的数据:

object a -> min:3 max:13
object b -> min:11 max:20
object c -> min:16 max:21
...
z-> min:200 max:250

对于指定的间隔,我希望a,b,c或其他对象或列表。

例如,如果(6,8)被传递,那么我想要" a",如果传递了(12,13)我希望有一个" a和b&#的列表34;如果(17,20)通过我想要一个" b和c"的列表如果(3,250)那么我想要一个所有的列表。

我不知道我应该在哪个类型的集合中存储值(3,13,对象a)和其他类型。

您能为该系列命名并举例吗?

提前致谢...

P.S。对不起,因为我的英语不能很好地描述,谢谢大家

4 个答案:

答案 0 :(得分:1)

因此,您希望找到最小值小于/等于传递的最小值且最大值大于/等于传递的最大值的对象。

var query = objects.Where(obj=> obj.MinVal <= minVal && obj.MaxVal >= maxVal);
  

您能为该系列命名并举例吗?

所以你没有收藏品?您应填写List<Range>,其中Range是一个自定义类,其中包含至少两个属性MinValMaxVal

答案 1 :(得分:1)

您可以创建自己的类型,也可以使用Tuple<int, int>来表示一个对象。然后,您可以创建并填充这些对象的List以存储整个集合。之后,您可以使用LINQ查询所需的对象:

List<Tuple<int, int>> YourCollection = new List<Tuple<int, int>>();
YourCollection.Add(new Tuple<int, int>(3, 13));
YourCollection.Add(new Tuple<int, int>(11, 20));
YourCollection.Add(new Tuple<int, int>(16, 21));

var Results = YourCollection.Where(x => x.Item1 <= MAX && MIN <= x.Item2);

其中MIN和MAX定义了您感兴趣的范围。请注意,上面的条件会查找重叠(交集),看起来就像是需要的。

答案 2 :(得分:1)

void Main()
{
    var input = new List<Interval>
    {
        new Interval { Name = "a", Min = 3, Max = 13 },
        new Interval { Name = "b", Min = 11, Max = 20 },
        new Interval { Name = "c", Min = 16, Max = 21 },
        new Interval { Name = "z", Min = 200, Max = 250 }
    };

    var interval = new Interval { Name = "search", Min = 12, Max = 13 };

    // Don't forget the third case when the interval 
    // you're looking for is inside your input intervals
    // Min = 210, Max = 220 should return "z"
    var result = input.Where(i => (interval.Min <= i.Min && i.Min <= interval.Max) ||
                                  (interval.Min <= i.Max && i.Max <= interval.Max) ||
                                  (i.Min <= interval.Min && interval.Max <= i.Max));
}

class Interval
{
    public string Name;
    public int Min;
    public int Max;
}

答案 3 :(得分:0)

如果你可以继承System.Collections.CollectionBase类,那么你可以使用@aush代码的分支,这样你就可以轻松地实现这个类。

structure Interval{
    public string Name;
    public int Min;
    public int Max;

    public Interval(string Name,int Min,int Max){
     this.Name = Name;
     this.Min = Min;
     this.Max = Max;
    }
    public bool IsInsideOfRange(int value){
        if(value >= this.Min && value <= this.Max){
           return true;
        }else{
           return false;
        }
    }
    public overrides ToString(){
      return this.Name;
    }

}

class IntervalCollection : System.Collections.CollectionBase {

   public void Add(string Name,int Min,int Max){
    Interval Item = new Interval(Name,Min,Max);
    this.List.Add(Item);
   }
   public void Add(Interval Item){
    this.List.Add(Item);
   }


   public string Encode(param int[] values){
       string EcodedText = "";
        foreach(int iValue in values){
           foreach(Interval Item in this){
                if(Item.IsInsideOfRange(iValue)){
                   EncodedText +=Item.ToString();
                }
           }
        }
       return EcodedText;
   }

}

你可以像这样实现这个类

IntervalCollection Intervals = new IntervalCollection();
string EncodeText  = "";
Intervals.Add(new Interval { Name = "a", Min = 3, Max = 13 });
Intervals.Add(new Interval { Name = "b", Min = 11, Max = 20 });
Intervals.Add(new Interval { Name = "c", Min = 16, Max = 21 });
Intervals.Add( "z", 200, 250 }); //you can add item in this way too.

EncodeText = Intervals.Encode(6,8,12,13,17,20);