Каков наилучший способ отфильтровать содержимое массива? - PullRequest
3 голосов
/ 23 февраля 2010

Скажем, у меня есть ArrayList объектов USBDevice. Каждый USBDevice имеет свойства ProductID и VendorID (среди прочих). Я хочу создать другой ArrayList, который является подмножеством первого, который содержит только USBDevice, который соответствует определенному VID. Какой самый короткий способ сделать это? Я еще не пробовал, но можно ли использовать лямбда-выражения следующим образом ...

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

Ответы [ 3 ]

5 голосов
/ 23 февраля 2010

Вам нужен актерский состав. Единственное, что компилятор знает о ArrayLists, это то, что они содержат объекты. Он не знает типы объектов внутри, поэтому вы должны сказать это.

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

Но это кажется довольно бессмысленным. Почему вы используете старый класс ArrayList и LINQ в одном проекте? Вместо этого вы должны попытаться начать использовать класс List<T> в пространстве имен System.Collections.Generic, тогда ваше выражение where будет работать без приведения, как вы хотите.

3 голосов
/ 23 февраля 2010

Чтобы согласиться с предложением @Mark Byers об использовании List , вот пример кода:

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 голосов
/ 23 февраля 2010

Да, вы можете использовать Где. Но для этого вам нужно привести ваш ArrayList к USBDevice. Это должно работать:

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

Но если вы можете использовать Linq, почему вы используете ArrayLists? Вместо этого вы должны использовать общие коллекции, такие как List.

Редактировать: Как отметил Ник в комментарии, рекомендуется использовать OfType (), если ваш ArrayList может содержать что-либо, кроме объектов USBDevice.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...