如何使用LAMBDA在三个列表的属性上的差异应该是相同的

时间:2014-08-25 19:22:36

标签: c# .net lambda

我有一个对象列表,在这种情况下是税表。 List<TaxForm>();现在,这些表单的一部分应该具有与某些属性相同的信息。他们都来自同一个客户。我如何查看列表中的所有纳税表格,并检查是否有任何让我们说财产&#34; RecordB&#34;是不同的。如果是这样,我需要标出差异。我无法想出使用lambda表达式做到这一点的方法。因此,例如,每个TaxForm上的所有BRecords应该具有相同的PayerName值。

var hasConflict = taxForms.Where(tf => tf.PayerName != priorTaxForm).Count > 0;

如果可能的话,我试着想出这样的方式。如果没有,我想我可以迭代列表并将当前形式与先前形式进行比较,如果不同,则存在差异。看起来很糟糕。提前谢谢!

我想要以更稳定的方式完成的一个例子如下:

var forms = jobObject.TaxForms;
string payerName = forms[0].ARecord.PayerName;
bool hasConflict = !forms.TrueForAll(tf => tf.ARecord.PayerName == payerName);

我为任何错别字道歉。比现在病了,加药,在家工作...... Blah。


根据芦苇的答案,我认为这最适合我的解决方案和场景。这样做不会很好:

这是我最后做的事情,感谢Reed的回答。这是一个稍微不同的场景,但我最终使用了类似的概念来满足我当前逻辑的需求。

forms.TrueForAll(t => forms[0].ARecord.PayerName == t.ARecord.PayerName);

实际上可见的问题描述:

注意*只有少数属性需要在所有形式中相同。不是所有物业。如果属性D,E,F属于什么,属性,属性或者PROERTYC存在冲突,请检查列表。所以,由于他们的支付名称应该始终相同,因此将形式的旗帜作为冲突。他们来自同一家公司。

表    ID:1099R    PayerName:一些信用社    SubmitDate:01/12/2015 形成    编号:1098    PayerName:一些Credit UnionForm    SubmitDate:01/20/2015 形成
   ID:1099INT    PayerName:不同的名称,因此标志数据    SubmitDate:01/5/2015

1 个答案:

答案 0 :(得分:3)

您可以使用Enumerable.Zip将列表合并在一起。

var conflicts = taxForm1.Zip(taxForm2, (one, two) => new {One = one, Two = two})
                        .Zip(taxForm3, (ot, three) => new {ot.One, ot.Two, Three = three})
                        .Where(f => f.One.PayerName != f.Two.PayerName || f.One.PayerName != f.Three.PayerName);

var hasConflicts =   (taxForm1.Count != taxForm2.Count) 
                  || (taxForm1.Count != taxForm3.Count)
                  || conflicts.Any();

编辑以回应评论:

如果您只是检查以验证列表中的所有项目是否相同,您可以执行以下操作:

// Note- requires at least one item in the list.  Add checks if needed.
var hasConflicts = taxForm.Skip(1).Any(t => t.PayerName != taxForm[0].PayerName);