[英]List sorting issue in c#
public static List<PreviewSchedule> BuildPreviewSchedule(Chatham.Business.Objects.Transaction transaction)
{
List<PreviewSchedule> items = new List<PreviewSchedule>();
List<ScheduleItem> scheduleItems = new List<ScheduleItem>(transaction.ScheduleCollection.FindAll(row => row.IsDeleted == false));
bool allFromDateFilledIn = !scheduleItems.Exists(item => !item.FromDate.HasValue);
bool allFloatingFromDateFilledIn = !scheduleItems.Exists(item => !item.FloatingFromDate.HasValue);
scheduleItems.Sort((a, b) => a.FromDate.GetValueOrDefault().CompareTo(b.FromDate.GetValueOrDefault()));
scheduleItems.Sort((a, b) => SortIt(a, b, allFromDateFilledIn, allFloatingFromDateFilledIn));
for (int i = 0; i < scheduleItems.Count; i++)
{
items.Add(new PreviewSchedule
{
Drop = i == 0 ? "$0.00" :
((scheduleItems[i - 1].PrincipalNotionalAmount - scheduleItems[i].PrincipalNotionalAmount)).Value.ToString(Format.CurrencyCentsIncludedFormatStringDollarSign),
EndDate = GetDateOrNull(scheduleItems[i].ToDate),
StartDate = GetDateOrNull(scheduleItems[i].FromDate),
Notional = scheduleItems[i].PrincipalNotionalAmount.Value.ToString(Format.CurrencyCentsIncludedFormatStringDollarSign),
FloatingEndDate = GetDateOrNull(scheduleItems[i].FloatingToDate),
FloatingStartDate = GetDateOrNull(scheduleItems[i].FloatingFromDate)
});
}
return items;
}
這是我們調用的方法,用於將日程表返回到mvc應用程序中的前端。 現在,此列表每次都以相同的方式將特定模型的最后兩行混合在一起。 看圖片:
在表格的最后兩行中,您可以很明顯地看到最后兩行被切換了,因為日期之間並沒有相互跟隨。 這種方法分散了那些混合的日期,我認為這是排序問題。 你們中的任何人都可以看到排序是在哪里造成的嗎?
提前謝謝。
編輯:
SortIt()代碼:
private static int SortIt(
Chatham.Business.Objects.ScheduleItem a,
Chatham.Business.Objects.ScheduleItem b,
bool allFromDateFilledIn,
bool allFloatingFromDateFilledIn)
{
return SortIt(a.FromDate, a.FloatingFromDate, b.FromDate, b.FloatingFromDate, allFromDateFilledIn, allFloatingFromDateFilledIn);
}
private static int SortIt(DateTime? aFrom,
DateTime? aFloatingFrom,
DateTime? bFrom,
DateTime? bFloatingFrom,
bool allFromDateFilledIn,
bool allFloatingFromDateFilledIn)
{
DateTime? a = null;
DateTime? b = null;
if (allFromDateFilledIn == false && allFloatingFromDateFilledIn == false)
{
a = aFrom ?? aFloatingFrom;
b = bFrom ?? bFloatingFrom;
}
else
{
a = allFromDateFilledIn ? aFrom : aFloatingFrom;
b = allFromDateFilledIn ? bFrom : bFloatingFrom;
}
if (a.HasValue && b.HasValue)
return a.Value.CompareTo(b.Value);
return 0;
}
我注意到倒數第二行是填寫所有四個日期的唯一行。我還注意到2013年10月1日早於2013年11月01日。 我強烈懷疑這些日期會一起比較。 但是,在不知道SortIt
方法是什么樣的情況下,我無法完全診斷或糾正該問題。 無論如何,這可能是您問題的根源,因此,我將重點放在您的問題上。
考慮一下填寫所有四個日期后應該怎么辦,並弄清楚如何處理這種情況。
現在,您已經添加了SortIt
代碼,看看您的allFromDateFilledIn
和allFloatingFromDateFilledIn
標志。 由於示例From和FloatingFrom列在某處至少包含一個空單元格,因此對於示例數據,這兩種情況始終都是錯誤的。 因此,您的SortIt
方法將始終對此進行評估:
a = aFrom ?? aFloatingFrom;
b = bFrom ?? bFloatingFrom;
...這意味着將不同列中的值進行比較。 這也意味着當From和FloatingFrom同時存在時,From始終作為比較值獲勝。
您可以嘗試使用內部if/else
替換上述if/else
:
if (aFrom != null && bFrom != null)
{
a = aFrom;
b = bFrom;
}
else if (aFloatingFrom != null && bFloatingFrom != null)
{
a = aFloatingFrom;
b = bFloatingFrom;
}
else
{
a = aFrom ?? aFloatingFrom;
b = bFrom ?? bFloatingFrom;
}
我覺得也許可以減少/修飾邏輯,但是用這種方式似乎最容易理解。 請注意,發件人的優先級仍高於FloatingFrom。
您可能還需要考慮您的布爾標志在做什么。 它們僅在一個或另一列完全填滿時才起作用,在這種情況下,它們會將該列鎖定為比較列。 那可能就是您想要的,或者可能是不必要的。 您已經確定From的優先級高於FloatingFrom,因此在沒有理由覆蓋該規則的情況下,出於一致性考慮,我只是遵循它。 只是一個想法。
這里有一個問題:
if (a.HasValue && b.HasValue)
return a.Value.CompareTo(b.Value);
return 0;
當a
或b
沒有值時,這可能會導致返回值不一致。 想象一下,如果sort方法使用a=2011/04/24
和b=null
調用此方法。 它將返回0。稍后在相同的排序中,可能會使用a=null
和b=2011/03/24
來調用它。 在這兩種情況下,該方法都將返回0。
比較方法返回不一致值時List.Sort
的行為是未定義的。 在這種情況下,給定三個值(我將使用數字,但對於日期也是如此),則無法給出可靠的排序。
a = 5
b = 10
c = null
比較a
和c
返回0。比較b
和c
返回0。 人們假設,如果a==c
和b==c
,則a==b
。 但是在這種情況下a < b
。 這將導致Sort
行為異常。 在這種情況下,某些排序方法會陷入無限循環或崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.