C# - Troubles with IEnumerable.Where

本文关键字:IEnumerable Where with Troubles | 更新日期: 2023-09-27 18:32:29

我目前正在开发一个小程序,该程序应该通过原始输入API获取条形码扫描仪(所谓的"HID")扫描的信息。

我已经阅读了许多关于此的教程,我想我正在了解它是如何工作的。我正在使用 IEnumerable 来枚举输入设备。但是现在编译器尖叫着说Where方法对于IEnumerable来说是未知的。

我已经浏览了有关IEnumerable的MSDN文章,如果我正确理解了这些文章,那么Where方法应该是其中的一部分。

下面是一个小片段,其中包含我想使用的地方 Where:

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

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

C# - Troubles with IEnumerable.Where

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

要使用的方法是 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)
我想

你的意思是Enumeration.Where这是一种扩展方法。它似乎根据类的类型及其基类或接口将方法"添加"到现有类。

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