2014-02-14 6 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.

В приведенном выше примере, - 3-й & 4 ряда неверен, так как Bid1 не имеет значения, но Bid2 делает.
- 2-я строка правильная, так как Bid1 имеет значение и, следовательно, Bid2 , имеющее значение в порядке, цена Bid2> Bid1. Пока строка 1 является
некорректна, так как Цена Bid 2 is < Цена Ставки 1

Может кто-нибудь, пожалуйста, посоветуйте подход для выполнения этой проверки.

+0

LINQ означает Language Integrated Query. Он не может выполнять никаких валидаций для вас. Если вы предоставите более подробную информацию, есть варианты. Проверяете ли вы при создании объектов, пытаетесь ли вы проверить в пользовательском интерфейсе, пытаетесь ли вы проверять при вставке строк базы данных и т. Д.? –

+0

Объект Ставки привязан к datagrid, я выполняю эти проверки нажатием кнопки. Объект уже существует и значения находятся в объекте. Если проверки не удались, я буду сообщать об этом пользователю, если нет, сохраните его в базе данных. –

+1

Вы пытались написать проверку не LINQ, прежде чем пытаться использовать LINQ? – MarcinJuraszek

ответ

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

Значения ставки должны быть перечислены для выполнения проверки на основе 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); 
Смежные вопросы