【发布时间】:2020-05-26 06:18:21
【问题描述】:
目前我有以下对象列表。所有字段都是字符串类型。
new PurchaseInvoice{ AccountCode="SUPPLIER1",BookingNo="BKG001",AccountingPeriod="2020002",}
new PurchaseInvoice{ AccountCode="3460",BookingNo="BKG001",AccountingPeriod="2020002",}
new PurchaseInvoice{ AccountCode="5120",BookingNo="BKG001",AccountingPeriod="2020002",}
new PurchaseInvoice{ AccountCode="5120",BookingNo="BKG001",AccountingPeriod="2020002",}
new PurchaseInvoice{ AccountCode="" ,BookingNo="BKG221",AccountingPeriod="2020002",}
new PurchaseInvoice{ AccountCode="1500",BookingNo="BKG221",AccountingPeriod="2020002",}
new PurchaseInvoice{ AccountCode="3460",BookingNo="BKG221",AccountingPeriod="2020002",}
new PurchaseInvoice{ AccountCode="1500",BookingNo="BKG221",AccountingPeriod="2020005",}
new PurchaseInvoice{ AccountCode="3460",BookingNo="BKG221",AccountingPeriod="2020005",}
new PurchaseInvoice{ AccountCode="5120",BookingNo="BKG221",AccountingPeriod="2020005",}
这需要先按会计期间排序,然后按AccountCode,但同时应该按BookingNo分组。
每组的第一行应该有供应商或空字符串(如果有)。
空字符串“”也可以是AccountCode
预期输出
SUPPLIER1 BKG001 2020002
3460 BKG001 2020002
5120 BKG001 2020002
5120 BKG001 2020002
BKG221 2020002
1500 BKG221 2020002
3460 BKG221 2020002
1500 BKG221 2020005
3460 BKG221 2020005
5120 BKG221 2020005
这是我尝试过的
//Sort
purchaseInvoiceList = purchaseInvoiceList.OrderBy(x => x.AccountingPeriod)
.ThenBy(x => x.AccountCode, new MixedComparer())
.ThenBy(x => x.BookingNo)
.ToList();
class MixedComparer : IComparer<string>
{
public int Compare(string x, string y)
{
int xVal, yVal;
var xIsVal = int.TryParse(x, out xVal);
var yIsVal = int.TryParse(y, out yVal);
if (xIsVal && yIsVal) // both are numbers...
return xVal.CompareTo(yVal);
if (!xIsVal && !yIsVal) // both are strings...
return x.CompareTo(y);
if (xIsVal) // x is a number, sort first
return -1;
return 1; // x is a string, sort last
}
}
我得到的结果
3460 BKG001 2020002
5120 BKG001 2020002
5120 BKG001 2020002
SUPPLIER1 BKG001 2020002
1500 BKG221 2020002
3460 BKG221 2020002
BKG221 2020002
1500 BKG221 2020005
3460 BKG221 2020005
5120 BKG221 2020005
如何根据预期输出对其进行排序?请问有人可以帮忙吗?
【问题讨论】:
-
我相信您只是缺少
GroupBy(x => x.BookingNo)? docs.microsoft.com/en-us/dotnet/api/… -
我看到的预期输出的不同之处在于您将数字放在字符串之前。无论如何,这就是您的比较器所做的。查看代码的 cmets。
-
这每个组的第一行应该有供应商或空字符串(如果存在)是什么意思。你只有一个 SUPPLIER1 和一个空字符串。实际上
var result = purchaseInvoiceList.OrderBy(x => x.BookingNo).ThenBy(x => x.AccountingPeriod).ToList();给了你一个预期的顺序,让第一列保持原样
标签: c# .net linq sorting object