我搜索过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。对不起,因为我的英语不能很好地描述,谢谢大家
答案 0 :(得分:1)
因此,您希望找到最小值小于/等于传递的最小值且最大值大于/等于传递的最大值的对象。
var query = objects.Where(obj=> obj.MinVal <= minVal && obj.MaxVal >= maxVal);
您能为该系列命名并举例吗?
所以你没有收藏品?您应填写List<Range>
,其中Range
是一个自定义类,其中包含至少两个属性MinVal
和MaxVal
。
答案 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)
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);