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

C# 将项目与列表中的其他项目进行比较,c#,linq,C#,Linq,我有一个可以观察到的投标集合,下面是类结构 public class Bids { public DateTime StartDateTimeLocal { get; set; } public DateTime EndDateTimeLocal { get; set; } public decimal Bid5 { get; set; } public decimal Price5 { g

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

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;}
publicobservableCollection出价{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 StartDateTimeLocal EndDateTimeLocal Bid5价格5价格4价格4价格3价格2价格2价格1 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,否则标书2中的非零值无效。类似地,bid1、bid2、bid3中的a值也可以,但如果bid4没有值,则bid5中的值无效
  • 出价必须保持不变,或者随着出价的增加而增加。因此,投标2的价格应等于或大于投标1的价格 在上述样本中, -第3行和第4行不正确,因为Bid1没有值,但 Bid2确实如此。
    -第二行是正确的,因为Bid1有一个值,因此Bid2 有一个值是好的,Bid2>Bid1的价格。而第1行是
    不正确,因为标书2的价格<标书1的价格


    是否有人可以建议执行此验证的方法

    Bids对象本身不是一个集合(不实现任何与LINQ相关的接口,如
    IEnumerable
    ),因此我不知道为什么要尝试使用LINQ来验证对象

    是的,您可以使用LINQ检查该特定
    ObservableCollection
    中的所有项目是否正常

    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。

    bid值需要是可枚举的,才能执行基于LINQ的验证。为什么不让出价值也成为一个可观察的集合呢?如果您确实有充分的理由将每个值作为单独的属性,则可以通过以下方式创建枚举:

    public IEnumerable<decimal> Values {
        get {
            yield return Bid1;
            yield return Bid2;
            yield return Bid3;
            yield return Bid4;
            yield return Bid5;
        }
    }
    
    然后通过以下方式进行验证:


    LINQ代表语言集成查询。它无法为您执行任何验证。如果您提供更多详细信息,则有可用的选项。您是否在创建对象时尝试验证,是否在UI上尝试验证,是否在插入DB行时尝试验证,等等?对象绑定到datagrid,我在单击按钮时执行这些验证。对象已存在,且值位于对象中。如果验证失败,我将向用户报告,如果没有,则将其保存到数据库中。在尝试使用LINQ之前,您是否尝试过编写非LINQ验证?使用空格而不是制表符,以使网格在帖子中看起来更美观。另外,使用标记
    将网格包裹起来,而不是使用4空格方法将其转换为预格式化文本的一部分,而不突出显示代码。您可能希望签出由用户制作的文件,该文件将为您执行一些格式设置,如制表符到空格。
    var pairs = Values.Zip(Values.Skip(1), (previous, current) => new {previous, current});
    
    var isValid = pairs.All(p => p.previous != 0 && p.current >= p.previous);