2014-02-14 2 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의 0이 아닌 값은 유효하지 않습니다. 마찬가지로 bid1, bid2, bid3의 값은 괜찮지 만 bid4에 값이 없으면 bid5의 값이 유효하지 않습니다.
  2. 입찰가가 올라갈수록 입찰가가 일정하거나 증가해야합니다. 따라서 입찰가 2 가격은 입찰가 1 가격과 동일하거나 더 높아야합니다. 위의 샘플에서

, - Bid1에 값이 없지만 Bid2는 않기 때문에 제 3 & 4 행은 올바르지 않습니다.
- Bid1이 값을 가지고 있으므로 Bid2 값이 괜찮으므로 두 번째 행은 정확합니다. Bid2 가격> Bid1. 입찰 2의 가격은 어떤 일이 유효성 검사를 수행하는 방법을 알려 주시기 바랍니다 수있는 입찰 1

의 < 가격이기 때문에 행 1
잘못된된다.

+0

LINQ는 언어 통합 쿼리를 의미합니다. 귀하를 위해 어떠한 검증도 수행 할 수 없습니다. 좀 더 자세한 내용을 입력하면 사용할 수있는 옵션이 있습니다. 개체를 만들 때 유효성을 검사하려고합니까, UI에서 유효성을 검사하려고합니까, DB 행 등을 삽입 할 때 유효성을 검사하려고합니까? –

+0

개체 입찰은 데이터 격자에 바인딩되어 있으며 버튼 클릭으로 이러한 유효성 검사를 수행하고 있습니다. 개체가 이미 있고 값이 개체에 있습니다. 유효성 검사가 실패하면이 사실을 사용자에게보고하고, 그렇지 않은 경우 데이터베이스에 저장합니다. –

+1

LINQ를 사용하기 전에 비 LINQ 유효성 검사를 시도 했습니까? – MarcinJuraszek

답변

2

Bids 개체 자체가 컬렉션이 아니기 때문에 (IEnumerable과 같은 LINQ 관련 인터페이스를 구현하지 않음) LINQ를 사용하여 개체의 유효성을 검사하려는 이유를 알 수 없습니다.

var validItems = source.Where(x => x.IsValid(x)); 

또는에만있는 이들을 : 특정 ObservableCollection<Bids>에있는 모든 항목을 확인하면

예, 당신은 유효한있는 경우에만이를 얻을 수 있습니다

var areAllOK = source.All(x => IsValid(x)); 

확인하기 위해 LINQ를 사용할 수 있습니다 유효하지 않음 :

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에 나와 있습니다. 가장 쉬운 방법은 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); 
관련 문제