过滤arraylist内容的最佳方法是什么?

时间:2010-02-23 15:42:21

标签: c# arraylist filter lambda

假设我有一个USBDevice Objects的ArrayList。每个USBDevice都有ProductID和VendorID属性(以及其他)。我想创建另一个ArrayList,它是第一个只包含与特定VID匹配的USBDevice的子集。这样做的最短路径是什么?我还没有尝试过这个,但是lambda表达式可以像这样使用......

ArrayList CompleteList = new ArrayList();
...
// Fill CompleteList with all attached devices....
...
ArrayList SubSetList = CompleteList.Where(d => d.VID == "10C4")

3 个答案:

答案 0 :(得分:5)

你需要一个演员。编译器对ArrayLists的唯一了解是它们包含对象。它不知道里面对象的类型,所以你必须告诉它。

ArrayList subSetList = new ArrayList(CompleteList.Cast<USBDevice>()
                                                 .Where(d => d.VID == "10C4")
                                                 .ToList());

但这似乎毫无意义。为什么在同一个项目中使用旧的ArrayList类和LINQ?你应该尝试开始使用System.Collections.Generic命名空间中的List<T>类,然后你的where表达式可以正常工作而不需要任何强制转换。

答案 1 :(得分:3)

为了配合@Mark Byers建议使用List&lt; T&gt;,这里有一些示例代码:

List<USBDevice> CompleteList = new List<USBDevice>();
CompleteList.Add(new USBDevice(){VID = "10C4", Other = "x"});
CompleteList.Add(new USBDevice() { VID = "10C4", Other = "x" });

//..Fill CompleteList with all attached devices....

List<USBDevice> SubSetList = new List<USBDevice>();
SubSetList = CompleteList.Where(d => d.VID.Equals("10C4")).ToList();

答案 2 :(得分:2)

是的,你可以使用Where。但为了做到这一点,你需要将ArrayList转换为USBDevice。这应该有效:

var subset = CompleteList.Cast<USBDevice>().Where(x =>d.VID = "10C4");

但是如果你能够使用Linq,你为什么要使用ArrayLists?您应该使用像List这样的通用集合。

编辑:正如尼克在评论中指出的那样,如果您的ArrayList可能包含除USBDevice对象以外的任何内容,则建议使用OfType()。