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
我需要根据规则验证可观察集合中的数据是否有效
-第二行是正确的,因为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);