2

私の comparer.Compare(x, y) が呼び出されないという、本当に厄介なエラーがあります。データベースから一連のエンティティを返す IList があり、データベースから返された各エンティティ内のエンティティのリストを並べ替えています。

つまり、この例では、各世帯に多くのアカウントがあり、サブリストをアカウント エンティティのプロパティで並べ替えたいと考えています。

私の呼び出しロジックは次のとおりです。

      List<Household> households = query.ToList();
        households.Sort(new HouseholdComparer());
        return households;

私の比較は次のようになります。

public class HouseholdComparer : IComparer<Household>
{
    public int Compare(Household x, Household y)
    {
        foreach (Account xAccount in x.Accounts)
        {
            foreach (Account yAccount in y.Accounts)
            {
                if (xAccount.StartDate == yAccount.StartDate)
                {
                    if ((xAccount.RevenueT12.HasValue && yAccount.RevenueT12.HasValue)
                        && (xAccount.RevenueT12.Value == yAccount.RevenueT12.Value))
                    {
                        if ((xAccount.AUAAnnual.HasValue && yAccount.AUAAnnual.HasValue)
                            && (xAccount.AUAAnnual.Value == yAccount.AUAAnnual.Value))
                            return 0; // all same whatever result

                        if (!xAccount.AUAAnnual.HasValue || !yAccount.AUAAnnual.HasValue) return 0;
                        if (xAccount.AUAAnnual.Value > yAccount.AUAAnnual.Value) return 1;
                        if (xAccount.AUAAnnual.Value < yAccount.AUAAnnual.Value) return -1;
                    }
                    else
                    {
                        if (!xAccount.RevenueT12.HasValue || !yAccount.RevenueT12.HasValue) return 0;
                        if (xAccount.RevenueT12.Value > yAccount.RevenueT12.Value) return 1;
                        if (xAccount.RevenueT12.Value < yAccount.RevenueT12.Value) return -1;
                    }
                }
                else
                {
                    if (x.StartDate > y.StartDate) return 1;
                    if (x.StartDate < y.StartDate) return -1;
                }
            }
        }
        return 0; // it shouldn't get here
    }

デバッガーを実行すると、コンストラクターでヒットが発生しますが、比較メソッドでは何もヒットしません。誰か助けてもらえますか?????

4

4 に答える 4

0

ご意見をお寄せいただきありがとうございます。

あなたの提案のいくつかを試してみたところ、アカウントを並べ替える世帯で並べ替えを試みるよりも、世帯内のアカウントを直接並べ替えることが最善の方法であることがわかりました。つまり、アカウントの戻り値の型をリストに変更してから、次のように検索を実行する必要がありました。

        //sort the internal Accounts in memory.
        List<Household> households = query.ToList();

        foreach (var household in households)
            household.Accounts.Sort(Compare);

        return households;

比較子は次のようにする必要があります。

    public static int Compare(Account xAccount, Account yAccount)
    {
        if (xAccount.StartDate == yAccount.StartDate)
        {
            if ((xAccount.RevenueT12.HasValue && yAccount.RevenueT12.HasValue)
                && (xAccount.RevenueT12.Value == yAccount.RevenueT12.Value))
            {
                if ((xAccount.AUAAnnual.HasValue && yAccount.AUAAnnual.HasValue)
                    && (xAccount.AUAAnnual.Value == yAccount.AUAAnnual.Value))
                    return 0; // all same whatever result

                if (!xAccount.AUAAnnual.HasValue || !yAccount.AUAAnnual.HasValue) return 0;
                if (xAccount.AUAAnnual.Value > yAccount.AUAAnnual.Value) return 1;
                if (xAccount.AUAAnnual.Value < yAccount.AUAAnnual.Value) return -1;
            }
            else
            {
                if (!xAccount.RevenueT12.HasValue || !yAccount.RevenueT12.HasValue) return 0;
                if (xAccount.RevenueT12.Value > yAccount.RevenueT12.Value) return 1;
                if (xAccount.RevenueT12.Value < yAccount.RevenueT12.Value) return -1;
            }
        }
        else
        {
            if (xAccount.StartDate > yAccount.StartDate) return 1;
            if (xAccount.StartDate < yAccount.StartDate) return -1;
        }

        return 0; // it shouldn't get here
    }

ご助力いただきありがとうございます!!!

于 2013-09-23T15:18:30.943 に答える
0

私は3つの考えられる理由を知っています:

  1. リストには要素が 1 つしかありません
  2. リストが空です
  3. リスト内のすべてのアイテムが異なるハッシュ コード (GetHashCode) を返します (これが、たとえば Distinct の動作です)。
于 2013-09-23T15:08:34.860 に答える