2010-10-19 73 views
2

我有一个ObservableCollection<myClass>列表。它包含MyClass类型的10个对象。ArrayList C#包含方法查询

class MyClass 
{ 
    string name; 
    int age; 
} 

如果我想找到列表,age = 10的所有项目,我可以使用Contains方法? 如果是,我怎么能不使用迭代来做到这一点?

+4

你的问题是关于ObservableCollection的,但你的标题是关于ArrayList的。请修改以保持一致。 – 2010-10-19 12:36:13

回答

6
var age10 = list.Where(i => i.age == 10); 

地段多个查询这里:http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

+0

请注意,虽然这是一个很好的解决方案,但它在幕后使用迭代。这对于10个对象来说没有问题,但如果在较大的集合上过度使用,则可能会很慢,因此请注意。 – 2010-10-19 12:44:17

+0

实际上,如果迭代的时间成本比处理循环中每个值的时间成本更重要,那么迭代器会很慢,*和*集合很大(高达数百)。如果是这样的话,你可能会想重新考虑一下你选择的数据结构:一个排序好的本地数组,一棵树或者一个列表字典会更好,因为它们是O(log N), O(log N)和O(1)分别进行搜索 - 而不是使用未分类的ObservableCollection得到的O(N)。 – 2010-10-19 23:52:25

5

没有,Contains只查找特定的值,不是匹配谓语。它也只发现一个值而不是每个匹配值。

你可以,但是,使用Where从LINQ到对象,假设你在.NET 3.5或更高版本:

foreach (var item in list.Where(x => x.Age == 10)) 
{ 
    // Do something with item 
} 
3

由于ObservableCollection<T>工具Collection<T>它实现IEnumerable<T> ......你可以使用LINQ到对象扩展方法,使这个简单的(即使它会在后台使用迭代):

var results = list.Where(m => m.age == 10); 
0

您可以使用LINQ来做到这一点,但不是Contains

var foo = from bar in myCollection where bar.age == 10 select bar; 
1

正如其他人所说,使用.Where(i => i.Age == 10)将是获得问题中所述结果的正确方法。您可以使用.Contains()来检查您的馆藏是否有特定的班级实例。