簡體   English   中英

C#中的列表排序問題

[英]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代碼,看看您的allFromDateFilledInallFloatingFromDateFilledIn標志。 由於示例From和FloatingFrom列在某處至少包含一個空單元格,因此對於示例數據,這兩種情況始終都是錯誤的。 因此,您的SortIt方法將始終對此進行評估:

a = aFrom ?? aFloatingFrom;
b = bFrom ?? bFloatingFrom;

...這意味着將不同列中的值進行比較。 這也意味着當From和FloatingFrom同時存在時,From始終作為比較值獲勝。

編輯2:

您可以嘗試使用內部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;

ab沒有值時,這可能會導致返回值不一致。 想象一下,如果sort方法使用a=2011/04/24b=null調用此方法。 它將返回0。稍后在相同的排序中,可能會使用a=nullb=2011/03/24來調用它。 在這兩種情況下,該方法都將返回0。

比較方法返回不一致值時List.Sort的行為是未定義的。 在這種情況下,給定三個值(我將使用數字,但對於日期也是如此),則無法給出可靠的排序。

a = 5
b = 10
c = null

比較ac返回0。比較bc返回0。 人們假設,如果a==cb==c ,則a==b 但是在這種情況下a < b 這將導致Sort行為異常。 在這種情況下,某些排序方法會陷入無限循環或崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM