繁体   English   中英

C#:检查对象(具有最小和最大属性的对象)是否落在任何现有对象之间? 在里面解释

[英]C# : Checking if an object (who has a min and max property) falls between any existing objects? Explained inside

我想知道是否有人可以帮忙?

我有一个包含对象集合的列表,每个对象都有一个min和max属性。

所以想象一下

 id : 1
 min : 10
 max : 49

 id : 2
 min : 50
 max : 69

 id : 3
 min : 70
 max : 89

我不应该被允许创建一个像这样的新对象。

 id : 4
 min : 88
 max : 91

因为这属于我已经拥有的范围。 (它与id 3重叠)因此没有重叠的范围。

我确实试图像这样解决它,但它无法正常工作

    var test =
            myObjects.FindAll(
                o => myMinVal.Value >= o.Min && myMaxVal.Value <= o.Max).ToList();

所以基本上如果test不为null,意味着我有重叠。

我试过逆转大于和小于迹象....

我有什么想法让这个工作?

提前致谢

编辑

还要举例说明这个对象,它也应该失败,因为它不会碰撞任何特定的1个对象! 当你看到3原版时,它会发生冲突。

 id : 4
 min : 5
 max : 91

我希望这是有道理的

你没有检查足够的东西。

基本上,您需要查看min是否在范围内,或者max是否在任何对象的范围内。 这是一个单位测试w /工作lambda:

[TestClass]
public class Overlap
{

    List<TestData> data = new List<TestData>
    {
        new TestData { Id = 1, Min = 10, Max= 49},
        new TestData { Id =2, Min=50, Max=69},
        new TestData { Id=3, Min = 70, Max = 89}
    };

    [TestMethod]
    public void BoundaryCheck()
    {
        var mydata = new TestData { Id=4, Min=69, Max=100};

        bool fail = data.Any(d => (d.Min <= mydata.Min && d.Max >= mydata.Min) || 
                                  (d.Max >= mydata.Max && d.Min <= mydata.Max));

        Assert.IsTrue(fail);
    }

    class TestData
    {
        public int Id { get; set; }
        public int Min { get; set; }
        public int Max { get; set; }
    }
}

我这样做:

class Interval {
    public int Id { get; set; }
    public int Min { get; set; }
    public int Max { get; set; } 
}

两种扩展方法,用于检查区间是否与其他区间重叠或多个区间中的任何一个:

public static bool Overlaps(this Interval interval, Interval targetInterval) {
    return interval.Min <= targetInterval.Max && 
               interval.Max >= targetInterval.Min;
}

public static bool Overlaps(this Interval interval, IEnumerable<Interval> targetIntervals) {
    return targetIntervals.Any(t => interval.Overlaps(t));
}

用法:

var interval = new Interval { Min = 5, Max = 15 };
bool isOverlapping = interval.Overlaps(intervalList);

不能

myMinVal.Value >= o.Min 

myMinVal.Value <= o.Min 

编辑 -

这不起作用?

var isValid = myObjects
               .Where(o => myMinVal.Value >= o.Min && myMaxVal.Value <= o.Max)
               .Any();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM