有这样一堂课:
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
规则检查上述范围是否重叠? (范围之间的差距有效)
答案 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
优势在于,这比迭代两个列表和应用条件更清晰,并且可以毫不费力地将其写入单行。