LINQ查询Distinct问题



我需要执行以下查询:

1) 列出过程

2) 按名称订购

3) 消除重复名称

4) 在查询期间用一些数据实例化控件

但在对进程名称排序后,我无法使用Distinct(它没有任何作用),我从未注意到这个问题,但Distinct语句可能只能用作查询的最后一个语句?

如何修复/改进此查询?

 From proc As Process In Process.GetProcesses
 Where Not BlackListedProcesses.Contains(proc.ProcessName)
 Order By proc.ProcessName Ascending
 Select New RadListDataItem With
        {
            .Text = String.Format("{0}.exe", proc.ProcessName),
            .Image = ResizeImage(Icon.ExtractAssociatedIcon(proc.MainModule.FileName).ToBitmap, Width:=16, Height:=16)
        }

更新

我发现我的错误太晚了,我试图区分进程对象,而不是它们的名称,因为我没有使用Select来选择进程名称,然后再区分它们,但如果我这样做,后续的Select语句将接收字符串,而不是进程。。。

我该怎么修?,我真的只需要一个查询就能完成。。。

 (From proc As Process In Process.GetProcesses
 Where Not BlackListedProcesses.Contains(proc.ProcessName)
 Order By proc.ProcessName Ascending
 Select proc.ProcessName
 Distinct).
 Select(Function(p As Process)
            Return New RadListDataItem With
                        {
                            .Text = String.Format("{0}.exe", p.ProcessName),
                            .Image = ResizeImage(Icon.ExtractAssociatedIcon(p.MainModule.FileName).ToBitmap, Width:=16, Height:=16)
                        }
        End Function)

您可以使用Jon Skeet的第三方库中的DistinctBy()方法;MoreLINQ:

.....
DistinctBy(Function(x) x.ProcessName)
.....

或者,您可以创建一个实现IEqualityComparer(Of Process),并将类别实例传递给Distinct()方法:

.....
Distinct(New ProcessComparer)
.....

详细的解释和其他可能的方法可以在Pranay Rana的以下文章中找到:

CodeProject:Linq中的DistinctBy(按属性查找Distinct对象)

我将分享解决方案,这个片段是更新RadListControl(用于winForms的Telerik控制套件)的数据源,该数据源包含当前进程(仅名称):

Dim ProcessItems As IEnumerable(Of RadListDataItem) =
    (From proc As Process In Process.GetProcesses
    Where Not BlackListedProcesses.Contains(proc.ProcessName)
    Order By proc.ProcessName Ascending).
    GroupBy(Function(p As Process) p.ProcessName).
    Select(Function(p As IGrouping(Of String, Process))
               Return New RadListDataItem With
                          {
                            .Text = String.Format("{0}.exe", p.First.ProcessName),
                            .Image = ResizeImage(Icon.ExtractAssociatedIcon(p.First.MainModule.FileName).ToBitmap, Width:=16, Height:=16)
                          }
           End Function)

最新更新