gpt4 book ai didi

c# - 在 ObservableCollection 上使用 Lambda 表达式

转载 作者:太空狗 更新时间:2023-10-29 22:08:27 25 4
gpt4 key购买 nike

在我的 Silverlight 4 应用程序中,我有一个 ObservableCollection,它由一个类的对象组成并由一个接口(interface)定义:

interface myInterface()
{
string Name { get; set; }
string Value { get; set; }
}

class myClass() : myInterface
{
...
}

ObservableCollection<myInterface> _collection;

在向集合中添加新元素之前,我想确保当前集合元素中不存在名称属性。由于我无法使用包含,我目前遍历所有元素并手动检查每个元素。

private bool CollectionContainsElement(string name2CheckAgainst)
{
foreach (myInterface item in _collection)
if (item.Name.Equals(name2CheckAgainst))
return true;

return false;
}

我读到这也可以通过 Lambda 表达式实现,所以我写了以下内容:

if (!_collection.Contains(p => p.Name == name2CheckAgainst))
{
...

但现在我得到一个错误,说“lambda 表达式无法转换为类型“myInterface”,因为它不是委托(delegate)类型”。 (措辞可能有所不同,因为我是从德语版本翻译过来的)

我不确定我必须更改什么才能使其正常工作。 using System.Linq; 包含在内。第二个问题(或者可能是主要问题):我已经读到,运行时间从 Contains() 方法的 O(1) 更改为 O(n) - 这并不比我当前的检查快。那么将其更改为使用 lambda 是否有意义?最后,是否可能有另一种方法来检查我的类中的现有名称属性?

提前致谢,
弗兰克

最佳答案

  1. 您不必编写 Contains 方法,Linq 的 Any 方法已经在这样做:

    if (!_collection.Any(p => p.Name == name2CheckAgainst))
  2. 如果您想使用 Lambda,则必须更改 Contains 方法的原型(prototype)以接受 Lambda(lambda 只是编写匿名函数的另一种方式):

    private bool CollectionContainsElement(Func<myInterface, bool> lambda)
    {
    foreach (myInterface item in _collection)
    if (lambda(item))
    return true;

    return false;
    }
  3. 在这里使用 lambda 不会改变函数的复杂性,在这两种情况下都是 O(n)。所以这只是一个偏好问题。

关于c# - 在 ObservableCollection 上使用 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8299150/

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