我遇到了需要编写的部分代码。 我有一个xml文件,我必须导入和返工,以便我可以在datagridview中显示我需要的东西。它全部基于发票类:
public class Invoice
{
public bool import { get; set; }
public string InvoiceNbr { get; set; }
public string AltInvoiceNbr { get; set; }
public string CustomerNbr { get; set; }
public string AltCustomerNbr { get; set; }
public DateTime InvoiceDate { get; set; }
public string Amount { get; set; }
public string FreightAmount { get; set; }
public string InsuranceAmount { get; set; }
public string TaxAmount { get; set; }
public string TaxFreightAmount { get; set; }
public int PrintSeq { get; set; }
}
在importfile中,invoicenbr有多个条目。 (每个发票行一个) 所以我按照以下陈述进行了分组。
invoices = invoices.GroupBy(i => new
{
i.InvoiceNbr,
i.AltInvoiceNbr,
i.CCN,
i.CustomerNbr,
i.AltCustomerNbr,
i.InvoiceDate,
i.PrintSeq
}).Select(i => new Invoice()
{
InvoiceNbr = i.Key.InvoiceNbr,
AltInvoiceNbr = i.Key.AltInvoiceNbr,
CCN = i.Key.CCN,
CustomerNbr = i.Key.CustomerNbr,
AltCustomerNbr = i.Key.AltCustomerNbr,
InvoiceDate = i.Key.InvoiceDate,
Amount = i.Sum(x => decimal.Parse(x.Amount)).ToString("F"),
FreightAmount = i.Sum(x => decimal.Parse(x.FreightAmount)).ToString("F"),
InsuranceAmount = i.Sum(x => decimal.Parse(x.InsuranceAmount)).ToString("F"),
TaxAmount = i.Sum(x => decimal.Parse(x.TaxAmount)).ToString("F"),
TaxFreightAmount = i.Sum(x => decimal.Parse(x.TaxFreightAmount)).ToString("F"),
PrintSeq = i.Key.PrintSeq
}).ToList();
因此输出在datagridview中看起来不错。现在有一些行,例如对于发票编号出现两次或多次的信用(或部分发货)。在这种情况下,PrintSeq> 1。
我需要过滤掉那些数据。
e.g。信用证有两个条目。 一个是InvoiceNbr 20160420-1,金额为50美元,另一个 使用相同的InvoiceNbr,金额为-50 $。
printSeq for + 50 $ invoice是1。 printSeq for -50 $ invoice是2。
我尝试过滤
.Where(x=>x.PrintSeq = 1)
但在这种情况下,一个条目保留在输出中。
如果我使用
.Where(x=>x.PrintSeq != 1)
我得到一个列表,显示我不想在输出中显示的InvoiceNbrs。
所以我现在正在搜索使用该列表过滤掉原始输出中所有使用Lambda表达式的invoiceNbrs的可能性。
(从发票中选择* 其中originallist.invoicenbr不是filterlist.invoicenbr)
我不想要使用外部库等。 (distinctby) 我试图首先使用嵌套groupby在原始列表中使用distinct,但这似乎不是正确的方法。
请帮忙
答案 0 :(得分:0)
SetInvoices(); //fills List<Invoice> invoices
SetManualInvoices();
// fills List<Invoice> manualinvoices with .Where(x=> x.printSeq >1)
invoices = invoices.Where(i=> !manualinvoices.Any(m=>m.InvoiceNbr == i.InvoiceNbr))
.ToList();
//select every invoice from invoices where invoicenbr is not in manualinvoices.
return invoices;
谢谢:D