在ObservableCollection上使用Lambda表达式

Aag*_*nor 5 c# collections lambda contains

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

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

class myClass() : myInterface
{
  ...
}

ObservableCollection<myInterface> _collection;
Run Code Online (Sandbox Code Playgroud)

在向集合添加新元素之前,我想确保Name-Property在当前集合元素中不存在.由于我无法使用contains,我目前遍历所有元素并手动检查每个元素.

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

  return false;
}
Run Code Online (Sandbox Code Playgroud)

我已经读过这也可以通过Lambda Expression实现,所以我写了以下内容:

if (!_collection.Contains(p => p.Name == name2CheckAgainst))
{
  ...
Run Code Online (Sandbox Code Playgroud)

但现在我收到一个错误,说"lambda表达式无法转换为Type"myInterface",因为它不是委托类型".(措辞可能有所不同,因为我从德文版翻译了它)

我不确定我需要改变什么才能让它发挥作用.using System.Linq;已经包括了.第二个问题(或者可能是主要问题):我已经读过,运行时从O(1)变为Contains() - 方法变为O(n) - 这不比我当前的检查快.那么将它改为使用lambda甚至是否有意义?最后,在我的班级中检查现有的Name-Property可能还有另一种方法吗?

先谢谢你,
弗兰克

Kev*_*sse 15

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

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

    private bool CollectionContainsElement(Func<myInterface, bool> lambda)
    {
      foreach (myInterface item in _collection)
        if (lambda(item))
          return true;
    
      return false;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在这里使用lambda不会改变函数的复杂性,在这两种情况下都是O(n).所以这只是一个偏好问题.