我有一个可观察的投标集合,下面是类结构。
public class Bids
{
public DateTime StartDateTimeLocal { get; set; }
public DateTime EndDateTimeLocal { get; set; }
public decimal Bid5 { get; set; }
public decimal Price5 { get; set; }
public decimal Bid4 { get; set; }
public decimal Price4 { get; set; }
public decimal Bid3 { get; set; }
public decimal Price3 { get; set; }
public decimal Bid2 { get; set; }
public decimal Price2 { get; set; }
public decimal Bid1 { get; set; }
public decimal Price1 { get; set; }
}
我有一个可观察的集合
public ObservableCollection<Bid> Bids {get; set;}
出价收集如下所示,
StartDateTimeLocal EndDateTimeLocal Bid5 Price5 Bid4 Price4 Bid3 Price3 Bid2 Price2 Bid1 Price1 2014-02-14 23:00 2014-02-14 23:30 0 0 0 0 0 0 50 10 100 100 2014-02-14 23:30 2014-02-15 00:00 0 0 0 0 0 0 10 300 200 10 2014-02-15 00:00 2014-02-15 00:30 0 0 0 0 0 0 100 30 0 10 2014-02-15 03:00 2014-02-15 01:00 0 0 0 0 0 0 30 100 0 0
我需要验证可观察集合中的数据是否符合规则......
在上面的例子中,
- 第3&amp;第4行不正确,因为Bid1没有值,但是
Bid2确实。
- 第二行是正确的,因为Bid1有一个值,因此Bid2
价值很好,Bid2的价格>标段。第1行是
不正确,因为出价2的价格是&lt;出价1
有人可以建议一种方法来执行此验证。
答案 0 :(得分:2)
Bids
对象本身不是集合(不实现任何与LINQ相关的接口,如IEnumerable
),所以我不知道你为什么要尝试使用LINQ来验证对象。
是的,您可以使用LINQ检查特定ObservableCollection<Bids>
中的所有项目是否正常
var areAllOK = source.All(x => IsValid(x));
您只能获得有效的这些:
var validItems = source.Where(x => x.IsValid(x));
或仅限于无效的
var invalidItems = source.Where(x => !x.IsValid(x));
但你必须编写IsValid
方法,我无法看到它如何在内部使用LINQ。
答案 1 :(得分:1)
出价值需要可枚举才能执行基于LINQ的验证。为什么不将出价值设为可观察的集合呢?如果你真的有充分的理由让每个值成为一个单独的属性,你可以用这种方式创建可枚举:
public IEnumerable<decimal> Values {
get {
yield return Bid1;
yield return Bid2;
yield return Bid3;
yield return Bid4;
yield return Bid5;
}
}
对于验证,您可能需要一个“滑动窗口”。 LINQ中没有包含任何内容,但this answer中给出了一些想法。最简单的是Zip {1,2,3 ...} {2,3,4 ...}:
var pairs = Values.Zip(Values.Skip(1), (previous, current) => new {previous, current});
然后使用All验证:
var isValid = pairs.All(p => p.previous != 0 && p.current >= p.previous);