将项目与列表中的其他项目进行比较

时间:2014-02-14 18:55:30

标签: c# linq

我有一个可观察的投标集合,下面是类结构。

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. 如果出价1有值,出价2应该只有一个值。因此,除非出价1,否则出价2中的非零值无效。同样,bid1,bid2,bid3中的值也可以,但如果bid4没有值,则bid5中的值无效。
  2. 当您提高出价时,出价必须保持不变或增加。因此,出价2的价格应该与出价1的价格相同或更高。
  3. 在上面的例子中,   - 第3&amp;第4行不正确,因为Bid1没有值,但是    Bid2确实。
      - 第二行是正确的,因为Bid1有一个值,因此Bid2    价值很好,Bid2的价格>标段。第1行是
       不正确,因为出价2的价格是&lt;出价1

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

2 个答案:

答案 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);