如何验证彼此之间的范围列表?
How to validate a list of ranges amongst each other?
有这样一个class:
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
规则来检查上述范围是否重叠? (范围之间的差距有效)
您可以通过在 From
属性 上排序范围,然后检查前一个元素的 To
属性 是否低于 [=11] =] 属性 当前元素:
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);
LINQ 可以在这方面帮助您:
bool overlaps = list.Any(r => list
.Except(new[] { r })
.Any(r2 => r.From >= r2.From && r.To <= r2.To)
);
使用嵌套 .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
优点是比遍历两个列表和应用条件更清晰,而且可以毫不费力地写成一行。
有这样一个class:
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
规则来检查上述范围是否重叠? (范围之间的差距有效)
您可以通过在 From
属性 上排序范围,然后检查前一个元素的 To
属性 是否低于 [=11] =] 属性 当前元素:
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);
LINQ 可以在这方面帮助您:
bool overlaps = list.Any(r => list
.Except(new[] { r })
.Any(r2 => r.From >= r2.From && r.To <= r2.To)
);
使用嵌套 .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
优点是比遍历两个列表和应用条件更清晰,而且可以毫不费力地写成一行。