2014-02-14 135 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); 
相關問題