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

时间:2013-02-19 02:23:39

标签: c# overloading operator-keyword

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;

如果从菜单中选择了选项,则会出现上述两件事。对于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并且它保持数据正常,但它只是不匹配列表中已有的项目。

2 个答案:

答案 0 :(得分:3)

正如@sapi和@TheEvilPenguin已经指出的那样,这种类型的运算符重载由于几个非常好的原因而不受欢迎。但是,这并没有回答你的问题。

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

请记住,ContainsRemove仅对列表中对象的特定实例有效。

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的语法操作。

答案 1 :(得分:2)

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

注意:正如大家所说在非数学相关类中使用+/-会导致非直观的代码。即你已经有了奇怪的行为 - 如果元素不存在-将无能为力。数字永远不会发生:whatever -2永远不等于whatever