【发布时间】:2012-01-08 02:34:33
【问题描述】:
在我的 Silverlight 4 应用程序中,我有一个 ObservableCollection,它由一个类的对象组成并由一个接口定义:
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”,因为它不是委托类型”。 (措辞可能不同,因为我是从德文翻译过来的)
我不确定我必须进行哪些更改才能使其正常工作。 using System.Linq; 包括在内。第二个问题(或者可能是主要问题):我已经读过,运行时从 Contains() 方法的 O(1) 更改为 O(n) - 这并不比我当前的检查快。那么将其更改为使用 lambda 是否有意义?最后,是否有另一种方法可以检查我的班级中现有的 Name-Property?
提前致谢,
弗兰克
【问题讨论】:
标签: c# collections lambda contains