gpt4 book ai didi

c# - 如何创建扩展方法来处理带有谓词输入的 bindinglist.removeall

转载 作者:行者123 更新时间:2023-12-02 15:38:48 25 4
gpt4 key购买 nike

myGenericList.RemoveAll(x => (x.StudentName == "bad student"));

效果很好,但绑定(bind)列表没有此方法。如何为绑定(bind)列表创建一个扩展方法,该方法将谓词作为输入,并像列表的 jar 装删除一样发挥作用

谢谢

最佳答案

就像我在评论中所说的,扩展方法没有什么神奇之处,只需像正常编写代码一样编写代码,只需将其放在静态类中的静态方法中并使用 this 关键字:

public static void RemoveAll<T>(this BindingList<T> list, Func<T, bool> predicate)
{
foreach (var item in list.Where(predicate).ToArray())
list.Remove(item);
}

您必须使用 ToArray() (或 ToList()),因为 Where() 是惰性的,仅在以下情况下枚举集合:需要,并且您无法枚举更改的集合。

虽然这个解决方案相当慢(O(N2)),因为每个 Remove() 都必须遍历集合以找到要删除的正确项目。我们可以做得更好:

public static void FastRemoveAll<T>(this BindingList<T> list, Func<T, bool> predicate)
{
for (int i = list.Count - 1; i >= 0; i--)
if (predicate(list[i]))
list.RemoveAt(i);
}

这利用了我们可以在常数时间内获得第 i 个项目的事实,因此整个方法的时间复杂度为 O(N)。迭代更容易向后编写,因此我们尚未考虑的项目的索引不会改变。

编辑:实际上第二个解决方案仍然是 O(N2),因为每个 RemoveAt() 都必须移动之后的所有项目被删除的那个。

关于c# - 如何创建扩展方法来处理带有谓词输入的 bindinglist.removeall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6598817/

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