2014-02-14 108 views
1

我有一个可观察的投标集合,类结构如下。将项目与列表中的其他项目进行比较

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 

我需要验证观察集合中的数据是按照规则有效.. 。

  1. 投标2应该只有一个价值如果出价1有价值。因此,除非出价1,否则出价2中的非零值无效。同样,bid1,bid2,bid3中的值也没有问题,但如果bid4没有值,则bid5中的值无效。
  2. 投标价格必须保持不变或增加。因此,投标2价格应该等于或大于投标1价格。

在上面的示例, - 第三届&第四行是不正确的,因为标段不具有价值,但 标段一样。
- 第二行是正确的,因为Bid1有一个值,因此Bid2 的值很好,Bid2> Bid1的价格。虽然第1行是
不正确,因为出价2的价格是<出价的价格1

有人可以建议一种方法来执行此验证。

+0

LINQ代表语言集成查询。它无法为您执行任何验证。如果你提供更多的细节,可以选择。你是否尝试在创建对象时进行验证,你是否想要在UI中进行验证,在插入数据库行时是否尝试验证等? –

+0

对象出价绑定到一个数据网格,我在按钮单击执行这些验证。该对象已存在并且值位于该对象中。如果验证失败,我会报告给用户,如果没有,则将其保存到数据库。 –

+1

您是否在尝试使用LINQ之前尝试编写非LINQ验证? – MarcinJuraszek

回答

2

Bids对象本身不是一个集合(没有实现任何与LINQ相关的接口,比如IEnumerable),所以我不知道你为什么试图使用LINQ来验证对象。

是的,你可以使用LINQ来检查,如果在特定ObservableCollection<Bids>所有项目都OK

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

出价值需要可枚举才能执行基于LINQ的验证。为什么不只是将出价值设置为可观察的集合呢?如果你真的有一个很好的理由,每个值是一个单独的属性,您可以创建枚举这样:

public IEnumerable<decimal> Values { 
    get { 
     yield return Bid1; 
     yield return Bid2; 
     yield return Bid3; 
     yield return Bid4; 
     yield return Bid5; 
    } 
} 

为了验证,你可能会想“滑动窗口”。 LINQ中没有包含任何内容,但有些想法在this answer中给出。最简单的方法是{012,{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); 
相关问题