gpt4 book ai didi

generics - 扩展方法Dictionary .RemoveAll?是否可以?

转载 作者:行者123 更新时间:2023-12-04 05:01:33 24 4
gpt4 key购买 nike

我一直在尝试编写一种扩展方法来模仿List.RemoveAll(Predicate)。

到目前为止,我已经知道了:

public static void RemoveAll<TKey,TValue>(this Dictionary<TKey,TValue> dict, 
Predicate<KeyValuePair<TKey,TValue>> condition)
{
Dictionary<TKey,TValue> temp = new Dictionary<TKey,TValue>();

foreach (var item in dict)
{
if (!condition.Invoke(item))
temp.Add(item.Key, item.Value);
}

dict = temp;
}

有指针吗?这是一个完全幼稚的实现吗?

最佳答案

您的代码将不起作用,因为您正在按值传递Dictionary类。这意味着最终的赋值(dict = temp)对调用函数不可见。在C#中,通过ref或out传递扩展方法目标是不合法的(在VB中,执行ByRef是合法的)。

相反,您将需要内联修改Dictionary。尝试以下

public static void RemoveAll<TKey,TValue>(this Dictionary<TKey,TValue> dict, 
Func<KeyValuePair<TKey,TValue>,bool> condition)
{
foreach ( var cur in dict.Where(condition).ToList() ) {
dict.Remove(cur.Key);
}
}

编辑

交换Where和ToList的顺序以减少列表分配的内存大小。现在,它将仅为要删除的项目分配一个列表。

关于generics - 扩展方法Dictionary <TKey,TValue> .RemoveAll?是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/654441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com