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并且它保持数据正常,但它只是不匹配列表中已有的项目。
答案 0 :(得分:3)
正如@sapi和@TheEvilPenguin已经指出的那样,这种类型的运算符重载由于几个非常好的原因而不受欢迎。但是,这并没有回答你的问题。
如果没有关于p
语句中Z = x - p
的来源的更多信息,我会怀疑您的问题是p
不是列表中存在的元素
请记住,Contains
和Remove
仅对列表中对象的特定实例有效。
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
上实现GetHashCode
和Person
来比较所有属性。
注意:正如大家所说在非数学相关类中使用+/-会导致非直观的代码。即你已经有了奇怪的行为 - 如果元素不存在-
将无能为力。数字永远不会发生:whatever -2
永远不等于whatever
。