为什么当我与 == 比较时,List<T>.RemoveAll 没有删除任何项目?
Why doesn't List<T>.RemoveAll remove any items when I compare with ==?
我有一个奇怪的问题。不知何故,此代码不会删除任何项目:
public static int RemoveAll<T>(this List<T> container, T item) where T : class
{
return container.RemoveAll(i => i == item));
}
尽管我在 VS Watch Window 中获得了 (i == item): true
中的一些。
当我像这样重写代码时,它确实出错了...
public static int RemoveAll<T>(this List<T> container, T item)
{
int n = 0;
while (container.Remove(item)) { ++n; }
return n;
}
我是否遗漏了关于 this List<T>
按值传递的秘密?该列表在函数内部也不会改变。
我是这样称呼它的:
List<string> completedTasks = new List<string>();
string taskId = ...;
...
completedTasks.RemoveAll(taskId);
第一个方法使用 ==
运算符(其中两个参数都是 object
,请注意,通用方法将无法为该特定类型找到此运算符的任何重载)。第二种方法使用object.Equals
.
因此,第一个方法将始终比较两个对象的引用,看它们是否引用同一个对象,第二个方法执行 Equals
方法被重写的任何操作。由于在这种情况下您似乎想使用 Equals
方法来实现相等(因为您已经声明这是具有正确结果的方法),所以您只需要使用 object.Equals
而不是 ==
当使用 RemoveAll
得到正确的结果时。
我有一个奇怪的问题。不知何故,此代码不会删除任何项目:
public static int RemoveAll<T>(this List<T> container, T item) where T : class
{
return container.RemoveAll(i => i == item));
}
尽管我在 VS Watch Window 中获得了 (i == item): true
中的一些。
当我像这样重写代码时,它确实出错了...
public static int RemoveAll<T>(this List<T> container, T item)
{
int n = 0;
while (container.Remove(item)) { ++n; }
return n;
}
我是否遗漏了关于 this List<T>
按值传递的秘密?该列表在函数内部也不会改变。
我是这样称呼它的:
List<string> completedTasks = new List<string>();
string taskId = ...;
...
completedTasks.RemoveAll(taskId);
第一个方法使用 ==
运算符(其中两个参数都是 object
,请注意,通用方法将无法为该特定类型找到此运算符的任何重载)。第二种方法使用object.Equals
.
因此,第一个方法将始终比较两个对象的引用,看它们是否引用同一个对象,第二个方法执行 Equals
方法被重写的任何操作。由于在这种情况下您似乎想使用 Equals
方法来实现相等(因为您已经声明这是具有正确结果的方法),所以您只需要使用 object.Equals
而不是 ==
当使用 RemoveAll
得到正确的结果时。