我需要执行以下查询:
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)