C# 重载减法运算符以删除对象

C# 重载减法运算符以删除对象,c#,overloading,operator-keyword,C#,Overloading,Operator Keyword,如果从菜单中选择了它们的选项,则会出现上述两种情况。对于选项。添加人结果与预期一致,并添加一个人。然而,我假设+&-会以完全相同的方式运行,只是相反,但它并没有这样发生 case Choices.ADD_PERSON: Console.WriteLine("enter info for person to add."); InfoForPerson(); PersonList

如果从菜单中选择了它们的选项,则会出现上述两种情况。对于
选项。添加人
结果与预期一致,并添加一个人。然而,我假设+&-会以完全相同的方式运行,只是相反,但它并没有这样发生

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;
上面是我对减法运算符的定义。下面是我用来让用户选择要加减的人的代码

public static PersonList operator -(PersonList x, Person y)
    {
        PersonList temp = x;
        if (temp._Plist.Contains(y))
        {
            temp._Plist.Remove(y);
        }
        return temp; }
它适用于加法,而不是减法。我观察了p,它很好地保存了数据,但它只是不匹配列表中已经存在的项。

用于
\u Plist
的任何类型的列表(或集合)都需要支持将
Person
匹配为“值”(如果引用,则默认)。您可以将自定义比较器传递给Contains函数,也可以在
Person
上实现
Equals
GetHashCode
来比较所有属性

注意:正如大家所说,在与数学无关的课程中使用+/-将导致非直观代码。也就是说,您已经有了奇怪的行为-如果元素不存在,
-
将什么也不做。对于数字,这种情况永远不会发生:
whatever-2
永远不会等于
whatever

用于
\u Plist
的任何类型的列表(或集合)都需要支持将
Person
匹配为“值”(如果引用,则默认)。您可以将自定义比较器传递给Contains函数,也可以在
Person
上实现
Equals
GetHashCode
来比较所有属性


注意:正如大家所说,在与数学无关的课程中使用+/-将导致非直观代码。也就是说,您已经有了奇怪的行为-如果元素不存在,
-
将什么也不做。这在数字中从未发生过:
whatever-2
决不等于
whatever

正如@sapi和@theevillpenguin所指出的,这种类型的运算符重载是不受欢迎的,有几个很好的理由。然而,这并不能回答你的问题

如果没有在
Z=x-p
语句中获得
p
的更多信息,我会怀疑您的问题在于
p
不是列表中存在的元素

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);
请记住,
包含
删除
仅对列表中对象的特定实例有效

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);
列表集合=新列表();
添加(新元组(1,1));
if(collection.Contains(新元组(1,1))
{
WriteLine(“这永远不会发生”);
}
移除(新元组(1,1);
Console.WriteLine(“{0}”,collection.Count);//=>1
如果要测试是否存在与测试值具有相同属性的类型的任何实例,则
Contains
不会执行此操作


另一点是,
-
操作符不应该(有些人会说必须不应该)修改左侧操作数。您应该返回一个包含筛选项的新列表,因为这是
a-B

的语法操作,正如@sapi和@theevillpenguin所指出的,这种类型的运算符重载是不受欢迎的,有几个很好的理由。但是,这并不能回答您的问题

如果没有在
Z=x-p
语句中获得
p
的更多信息,我会怀疑您的问题在于
p
不是列表中存在的元素

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);
请记住,
包含
删除
仅对列表中对象的特定实例有效

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);
列表集合=新列表();
添加(新元组(1,1));
if(collection.Contains(新元组(1,1))
{
WriteLine(“这永远不会发生”);
}
移除(新元组(1,1);
Console.WriteLine(“{0}”,collection.Count);//=>1
如果要测试是否存在与测试值具有相同属性的类型的任何实例,则
Contains
不会执行此操作


另一点是,
-
操作符不应该(有些人会说必须不应该)修改左边的操作数。您应该返回一个包含筛选项的新列表,因为
a-B

的语法操作是重载+/-,以便从“列表”中添加/删除确实是一个好主意?这似乎是一个非常不直观的代码的配方。我已经编辑了您的标题。请参阅“,共识是“不,他们不应该”。我同意sapi。请不要这样做。添加一个Remove方法,而不是尝试重新定义其他运算符,以执行与每个人都认为他们将要执行的不同的操作。@user1993843对于在自定义类上执行数学运算非常有用。例如,如果您要滚动自己的
弧度
类,这会带来很多好处对它们使用
+
-
是有意义的。例如,减去两个
DateTime
对象以获得
TimeSpan
。在
列表中使用它通常是非常规的,而且你几乎总是看不到它。(至少,直到今天我才看到!)昨天你问了这个关于加法运算符的问题:许多人告诉你这是一个反模式,或者至少是非常不习惯的。在描述减法运算符时没有任何变化,从昨天起也没有任何变化。重载+/-以便从“列表”中添加/删除真的是一个好主意吗?这似乎是一个令人难以置信的方法y非直观代码。我已编辑了您的标题。请参见“”,其中的共识是“不,他们不应该”。我同意sapi。请不要这样做。添加一个Remove方法,而不是尝试重新定义其他运算符,以执行与每个人认为他们将要执行的不同的操作。@user1993843对于在自定义类上执行数学运算非常有用。例如,如果您要滚动自己的
弧度
类,它会