我有类型结构的列表,我暂时添加数据并在将数据写入数据库或文件时删除它们,我使用list.RemoveAll
方法从列表中删除项目。
list.RemoveAll
如果我在一个计数为零的列表上调用ArgumentNullException
,它应该抛出 _dataNotWrittenToDb.RemoveAll(item => item.ScopeId == _a2Data.ScopeId);
_dataWrittenToDB.RemoveAll(item => item.ScopeId == _a2Data.ScopeId);
,但即使计数为零也不会抛出任何异常。
{{1}}
答案 0 :(得分:2)
来自MSDN
<强>例外强>
Exception Condition
ArgumentNullException
match is null.
只有当传递参数为null时,RemoveAll抛出ArgumentNullException,在你的情况下它不是null
RemoveAll的工作是删除所有符合给定条件的元素,在你的情况下没有匹配的元素,没有删除,没有理由返回异常
答案 1 :(得分:1)
如果你想要例外,你可以这样做:
Predicate<YourItemStruct> p = item => item.ScopeId == _a2Data.ScopeId;
if (!_dataNotWrittenToDb.Exists(p))
throw new Exception("No items exist to delete");
_dataNotWrittenToDb.RemoveAll(p);
if (!_dataWrittenToDb.Exists(p))
throw new Exception("No items exist to delete");
_dataWrittenToDb.RemoveAll(p);
答案 2 :(得分:0)
从列表反编译来源:
public int RemoveAll(Predicate<T> match)
{
if (match == null)
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
int index1 = 0;
while (index1 < this._size && !match(this._items[index1]))
++index1;
if (index1 >= this._size)
return 0;
int index2 = index1 + 1;
while (index2 < this._size)
{
while (index2 < this._size && match(this._items[index2]))
++index2;
if (index2 < this._size)
this._items[index1++] = this._items[index2++];
}
Array.Clear((Array) this._items, index1, this._size - index1);
int num = this._size - index1;
this._size = index1;
++this._version;
return num;
}
正如您所看到的,此方法抛出ArgumentNullException
的唯一时间是参数实际上等于null
。
答案 3 :(得分:-1)
如果count
为0,则表示该列表为空。但列表存在。 Null
表示该列表不存在。
NullReferenceException
只会在null
个对象上抛出,而不是空洞。
它就像现实生活中的一个空盒子,相比之下根本就没有盒子。