На данный момент у меня есть следующий список объектов. Все поля имеют строковый тип.
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
Как это можно отсортировать по ожидаемому результату? Кто-нибудь может здесь помочь?