C# - 与IEnumerable.Where一起烦恼

时间:2014-11-28 08:27:56

标签: c# linq extension-methods

我目前正在开发一个小程序,它应该通过Raw-Input API获取条形码扫描器(所谓的“HID”)扫描的信息。

我已经阅读了很多关于这方面的教程,我想我正在理解它是如何工作的。我正在使用IEnumerable来枚举输入设备。但是现在编译器尖叫说IEnumerable不知道Where - Method。

我正在阅读有关IEnumerable的MSDN文章,如果我理解正确的文章,Where - 方法应该是其中的一部分。

在我想要使用Where:

的地方的小片段下方
var rawInputDevice in rawDeviceEnumerator.Devices
    .Where(d => d.DeviceType == Win32.RawInputDeviceType.Keyboard)

有人可以给我一个方法吗? 我认为这只是我监督的一件小事。

2 个答案:

答案 0 :(得分:1)

我认为你的意思是Enumeration.Where extension method。它似乎是在添加'现有类的方法基于类的类型及其基类或接口。

如果在代码文件中包含System.Linq作为命名空间,您会看到此扩展方法将出现在实现IEnumerable<TSource>的每个对象上,例如List<T>int[]

答案 1 :(得分:1)

您注意到的问题通常来自.net 3.0之前的较旧的Collection类型,它引入了泛型类型。

您要使用的方法是Enumerable.Where(this IEnumerable<T> enumerable, Func<T,bool> predicate)。但rawDeviceEnumerator.Devices似乎是IEnumerable而非IEnumerable<T>。假设您使用http://www.news2news.com/vfp/?example=571&ver=vcs&PHPSESSID=5f4393ed0b6c7c205851a834e657e8be中的RawInputDeviceEnumerator,那么您有几种选择。

首先。从

更改代码
    public IEnumerable Devices
    {
        get
        {
            return this._devices;
        }
    }

    public IEnumerable<RawInputDevice> Devices
    {
        get
        {
            return this._devices;
        }
    }

或者您可以使用

var rawInputDevice in rawDeviceEnumerator.Devices
                  .Cast<RawInputDevice>()
                  .Where(d => d.DeviceType == Win32.RawInputDeviceType.Keyboard)