C# 用于检索EnableBIDI=true的打印机的Linq语句

C# 用于检索EnableBIDI=true的打印机的Linq语句,c#,linq,C#,Linq,这对林克大师来说应该是一个简单的问题 我想检索用户可用的所有物理打印机。据我所知,没有可以查询的属性/设置,可以告诉您打印机是物理打印机还是虚拟打印机。但是关于这个话题已经有一个问题了: 我使用一种可靠的ish方法来查看它是否是虚拟的,并检查“EnableBIDI”属性是否设置为true ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); ManagementObjectCollection col

这对林克大师来说应该是一个简单的问题

我想检索用户可用的所有物理打印机。据我所知,没有可以查询的属性/设置,可以告诉您打印机是物理打印机还是虚拟打印机。但是关于这个话题已经有一个问题了:

我使用一种可靠的ish方法来查看它是否是虚拟的,并检查“EnableBIDI”属性是否设置为true

 ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
 ManagementObjectCollection coll = searcher.Get();
 var installedPhysicalPrinters = new List<string>();


        var scratch = from ...
显然这是错误的,我在列表中得到了一个“true”值列表,而不是打印机名称


使用nested for eaches很容易解决,但这只是2004年的事…

将LINQ和System结合起来的问题。管理是后者使用了旧的非通用容器(如ManagementObjectCollection),而您不能直接使用LINQ,因为它使用了非通用的IEnumerable接口

幸运的是,您可以解决这个问题,如下例所示:

static void Main(string[] args)
{
    Func<PropertyData, bool> indicatesPhysical = property => property.Name == "EnableBIDI"; // && (bool) property.Value;
    Func<ManagementBaseObject, bool> isPhysicalPrinter = obj => obj.Properties.OfType<PropertyData>().Any(indicatesPhysical);

    var searcher = new ManagementObjectSearcher("Select * from Win32_Printer");
    var collection = searcher.Get();
    var physicalPrinters = collection.OfType<ManagementBaseObject>().Where(isPhysicalPrinter);

    foreach (var item in physicalPrinters)
    {
        Console.WriteLine(item.Properties["DeviceID"].Value);
        Console.WriteLine(item.Properties["EnableBIDI"].Value);
    }
}
static void Main(字符串[]args)
{
Func indicatesPhysical=property=>property.Name==“EnableBIDI”;//&(bool)property.Value;
Func isPhysicalPrinter=obj=>obj.Properties.OfType().Any(指示为物理);
var searcher=newmanagementobjectsearcher(“从Win32_打印机中选择*);
var collection=searcher.Get();
var physicalPrinters=collection.OfType()。其中(isPhysicalPrinter);
foreach(physicalPrinters中的变量项)
{
Console.WriteLine(item.Properties[“DeviceID”].Value);
Console.WriteLine(item.Properties[“EnableBIDI”].Value);
}
}
您可以使用
Enumerable.OfType()
扩展方法将指定的
IEnumerable
接口转换为
IEnumerable
。这将有助于解决这些问题

您关于如何区分物理打印机和虚拟打印机的示例在我这方面不起作用,但它与您正在处理的主要问题无关,即试图通过使用LINQ表达式使代码更具可读性

static void Main(string[] args)
{
    Func<PropertyData, bool> indicatesPhysical = property => property.Name == "EnableBIDI"; // && (bool) property.Value;
    Func<ManagementBaseObject, bool> isPhysicalPrinter = obj => obj.Properties.OfType<PropertyData>().Any(indicatesPhysical);

    var searcher = new ManagementObjectSearcher("Select * from Win32_Printer");
    var collection = searcher.Get();
    var physicalPrinters = collection.OfType<ManagementBaseObject>().Where(isPhysicalPrinter);

    foreach (var item in physicalPrinters)
    {
        Console.WriteLine(item.Properties["DeviceID"].Value);
        Console.WriteLine(item.Properties["EnableBIDI"].Value);
    }
}