2

みんなおはよう、

「含む」を使用して、オブジェクトがコレクション内にあるかどうかを確認しようとしています。中断すると、オブジェクトが実際にコレクションの一部であることがわかりますが、「含む」はアイテムがコレクションにないことを示す false を返しているようです。私が間違っていることは何か分かりますか?

if(HttpContext.Current.Session["AutoPayTypes"] != null)
{
    var autopays = HttpContext.Current.Session["AutoPayTypes"] as List<PaymentTypeInfo>;
    char? coverageProductLine = null;

    if(entityProps.ContainsKey("CoverageProductLine"))
    {
       coverageProductLine = (char?)entityProps["CoverageProductLine"];
    }

    var paymentTypeInfoRepository = new PaymentTypeInfoRepository();
    var payType = paymentTypeInfoRepository.GetPaymentTypeInfo(paymentAdd.PayType,
    coverageProductLine);

    if (autopays != null && payType != null)
        paymentAdd.DaysPaid = autopays.Contains(payType) ? null : paymentAdd.DaysPaid;
}

オブジェクトがコレクションにない場合、"DaysPaid" は null である必要があります。何か案は?

***更新 PaymentTypeInfo は、標準の LinqToSql 生成クラスです。この時点で、Equals も GetHashCode もオーバーライドされていません。そのソースはこちら。

[Table(Name="dbo.S_OptPaymentType")]
public partial class PaymentTypeInfo
{

    private string _PaymentId;

    private string _PaymentCode;

    private System.Nullable<char> _CoverageType;

    private string _ActionCode;

    private System.Nullable<char> _PaymentType;

    private string _BenAction;

    private System.Nullable<char> _BenPremDisFlag;

    private string _APNextToLastAct;

    private string _APLastAct;

    public PaymentTypeInfo()
    {
    }

    [Column(Storage="_PaymentId", DbType="Char(3) NOT NULL", CanBeNull=false)]
    public string PaymentId
    {
        get
        {
            return this._PaymentId;
        }
        set
        {
            if ((this._PaymentId != value))
            {
                this._PaymentId = value;
            }
        }
    }

    [Column(Storage="_PaymentCode", DbType="Char(2) NOT NULL", CanBeNull=false)]
    public string PaymentCode
    {
        get
        {
            return this._PaymentCode;
        }
        set
        {
            if ((this._PaymentCode != value))
            {
                this._PaymentCode = value;
            }
        }
    }

    [Column(Storage="_CoverageType", DbType="Char(1)")]
    public System.Nullable<char> CoverageType
    {
        get
        {
            return this._CoverageType;
        }
        set
        {
            if ((this._CoverageType != value))
            {
                this._CoverageType = value;
            }
        }
    }

    [Column(Storage="_ActionCode", DbType="VarChar(3)")]
    public string ActionCode
    {
        get
        {
            return this._ActionCode;
        }
        set
        {
            if ((this._ActionCode != value))
            {
                this._ActionCode = value;
            }
        }
    }

    [Column(Name="PaymentType", Storage="_PaymentType", DbType="Char(1)")]
    public System.Nullable<char> PaymentType
    {
        get
        {
            return this._PaymentType;
        }
        set
        {
            if ((this._PaymentType != value))
            {
                this._PaymentType = value;
            }
        }
    }

    [Column(Storage="_BenAction", DbType="VarChar(3)")]
    public string BenAction
    {
        get
        {
            return this._BenAction;
        }
        set
        {
            if ((this._BenAction != value))
            {
                this._BenAction = value;
            }
        }
    }

    [Column(Storage="_BenPremDisFlag", DbType="Char(1)")]
    public System.Nullable<char> BenPremDisFlag
    {
        get
        {
            return this._BenPremDisFlag;
        }
        set
        {
            if ((this._BenPremDisFlag != value))
            {
                this._BenPremDisFlag = value;
            }
        }
    }

    [Column(Storage="_APNextToLastAct", DbType="VarChar(3)")]
    public string APNextToLastAct
    {
        get
        {
            return this._APNextToLastAct;
        }
        set
        {
            if ((this._APNextToLastAct != value))
            {
                this._APNextToLastAct = value;
            }
        }
    }

    [Column(Storage="_APLastAct", DbType="VarChar(3)")]
    public string APLastAct
    {
        get
        {
            return this._APLastAct;
        }
        set
        {
            if ((this._APLastAct != value))
            {
                this._APLastAct = value;
            }
        }
    }
}

ありがとう、サンディエゴで~ck

4

5 に答える 5

3

編集: Ahmad が指摘したように、条件演算子の使用法は正しくありません。ただし、ここでは条件演算子を使用する必要さえありません。分岐の 1 つがノーオペレーションになるからです。これを使用するだけです:

if (autopays != null && payType != null && !autopays.Contains(payType))
{
    paymentAdd.DaysPaid = null;
}

元の答え

あなたは何も示していませんPaymentTypeInfo-それはオーバーライドEqualsしてGetHashCode適切ですか? そうでない場合、包含チェックは参照 ID を使用して実行され、セッション内の参照がリポジトリ内の参照と同じである可能性はほとんどありません。

PaymentTypeInfoオーバーライドするEqualsとを作成するかGetHashCode、適切なIEqualityComparer<PaymentTypeInfo>Containsメソッドに渡します。

(SLaks がコメントで述べているように、この場合GetHashCode実際には呼び出されませんが、常に両方EqualsをオーバーライドGetHashCodeするか、どちらもオーバーライドしないでください。オーバーライドする場合、一貫した方法で行う必要があります。)

于 2010-03-18T17:45:58.387 に答える
2

payTypeオーバーライドEqualsするか、 を指定しIEqualityComparerない限りContains、参照によって比較されます。

コレクションには、論理的に同等なクラスの別のインスタンスが含まれている可能性があります。

于 2010-03-18T17:46:04.223 に答える
1

等式の問題が発生している可能性があります。Contains() は IEquatable.Equals メソッドを使用するため、PaymentTypeInfo クラスの個別のインスタンスに対して true が返されることを確認してください。

于 2010-03-18T17:45:56.047 に答える
1

これまでのすべての投稿には有効なポイントがあります。使用するタイプによってContainsは十分でない場合があります。私はあなたの質問の別の部分に取り組んでいます:

オブジェクトがコレクションにない場合、"DaysPaid" は null である必要があります。何か案は?

上記のステートメントに一致するように、三項演算子の値の順序を変更してみてはどうでしょうか? これを使って:

paymentAdd.DaysPaid = autopays.Contains(payType) ? paymentAdd.DaysPaid : null;

これの代わりに:

paymentAdd.DaysPaid = autopays.Contains(payType) ? null : paymentAdd.DaysPaid;

ステートメントfalseが 2 番目のアイテムに評価される場合は使用されるので、それを作成しnullます。構造は次のとおりです。

logic statement ? true : false
于 2010-03-18T17:48:12.877 に答える
0

PaymentTypeクラスのソースを投稿できますか?この型が値ベースのセマンティクスを提供しないことはかなり確信しているため、Containsメソッドは ID の等価性を使用することを余儀なくされます (これでは、必要な結果が得られません)。

この場合は、このトピックについて私が書いた次の記事に興味があるかもしれません。

于 2010-03-18T17:46:20.763 に答える