如何验证彼此之间的范围列表?

时间:2016-07-13 14:50:59

标签: c# fluentvalidation

有这样一堂课:

public class MyRange
{
    public int From {get; set;}
    public int To {get; set;}

    public MyRange(int from, int to)
    {
        From = from;
        To = to;
    }
}

List<MyRange>具有以下值:

var list = new List<MyRange>();
list.Add(new MyRange(1, 1000));
list.Add(new MyRange(1001, 2000));
list.Add(new MyRange(50, 1500));
list.Add(new MyRange(1900, 2900)); 

是否可以使用FluentValidation规则检查上述范围是否重叠? (范围之间的差距有效)

3 个答案:

答案 0 :(得分:4)

您可以通过在From属性上排序范围,然后检查先前元素的To属性是否低于当前元素的From属性来实现:

var ordered = list.OrderBy(r => r.From).ToList();
var isValid = ordered
    .Zip(ordered.Skip(1), (a, b) => new {Prior = a, Current = b})
    .All(p => p.Prior.To <= p.Current.From);

答案 1 :(得分:0)

LINQ可以在这里为您提供帮助:

bool overlaps = list.Any(r => list
                           .Except(new[] { r })
                           .Any(r2 => r.From >= r2.From && r.To <= r2.To)
                        );

答案 2 :(得分:0)

使用嵌套.Any

list.Any(x => list.Any(y => x.From < y.From && x.To > y.From || x.From < y.From && x.To > y.From))

这会将列表作为两个foreach指令进行迭代,其中一个带有x变量,另一个带有y变量,并使用本来使用的条件检查每个变量之间的重叠两条foreach说明:

x.From < y.From && x.To > y.From || x.From < y.From && x.To > y.From

优势在于,这比迭代两个列表和应用条件更清晰,并且可以毫不费力地将其写入单行。