1
case Choices.ADD_PERSON:
                    Console.WriteLine("enter info for person to add.");
                    InfoForPerson();
                    PersonList Z = x + p;
                    break;

case Choices.REMOVE_PERSON:
                    Console.WriteLine("enter info for person to remove: ");
                    InfoForPerson();
                    Z = x - p;
                    break;

上記は、メニューからオプションを選択した場合に発生する 2 つのことです。結果はChoices.ADD_PERSON予想通りで、人が追加されました。ただし、 + & - はまったく同じように、ちょうど逆に機能すると思いましたが、そのようには発生していません。

public static PersonList operator -(PersonList x, Person y)
    {
        PersonList temp = x;
        if (temp._Plist.Contains(y))
        {
            temp._Plist.Remove(y);
        }
        return temp; }

上記は、減算演算子の私の定義です。以下は、ユーザーが加算/減算する人を選択できるようにするために使用していたコードです。

public static void InfoForPerson()
    {
        Console.Write("Enter your name: ");
        string name = Console.ReadLine();
        string phone = ValidPhone();
        string email = ValidEmail();
        p = new Person(name, phone, email);

減算ではなく、加算に対しては正常に機能します。p を見たところ、データは正常に保持されていますが、既にリストにある項目と一致していません。

4

2 に答える 2

3

@sapi と @TheEvilPenguin がすでに指摘したように、このタイプの演算子のオーバーロードは、いくつかの非常に正当な理由で嫌われています。しかし、それはあなたの質問には答えません。

ステートメントのどこpから取得したかについての詳細情報がなければ、リストに存在する要素ではないことが問題であると思われます。Z = x - pp

ContainsandRemoveは、リスト内のオブジェクトの特定のインスタンスに対してのみ有効であることに注意してください。

List<Tuple<int, int>> collection = new List<Tuple<int, int>>();
collection.Add(new Tuple<int, int>(1, 1));
if (collection.Contains(new Tuple<int, int>(1, 1))
{
    Console.WriteLine("This will NEVER happen.");
}
collection.Remove(new Tuple<int, int>(1, 1);
Console.WriteLine("{0}", collection.Count); // => 1

テストされた値と同じプロパティを持つ型のインスタンスの存在をテストしたい場合は、それContainsを行いません。

別のポイントとして、-演算子は左側のオペランドを変更すべきではありません (一部の人は、変更してはいけないと言う人もいます)。の構文操作であるため、フィルタリングされたアイテムを含む新しいリストを返す必要がありA - Bます。

于 2013-02-19T02:34:54.670 に答える
2

使用しているリスト (またはコレクション) のタイプに関係なく、「値」としての_Plistマッチングをサポートする必要があります (参照の場合はデフォルト)。Personカスタム コンパレータを Contains 関数に渡すか、実装EqualsGetHashCodePersonすべてのプロパティを比較することができます。

注:誰もが言ったように、数学に関連しないクラスで +/- を使用すると、直感的でないコードになります。つまり、すでに奇妙な動作をしています - 要素が存在しない場合-は何もしません。これは数値では決して起こりwhatever -2ませんwhatever

于 2013-02-19T02:33:31.860 に答える