我需要执行此查询:
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
语句接收字符串而不是进程...
我如何修复它?,我真的只会在1个查询中完成这个...
(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)
答案 0 :(得分:1)
您可以使用Jon Skeet的第三方库中的DistinctBy()
方法; MoreLINQ
:
.....
DistinctBy(Function(x) x.ProcessName)
.....
或者您可以创建实现IEqualityComparer(Of Process)
的类并将类实例传递给Distinct()
方法:
.....
Distinct(New ProcessComparer)
.....
详细解释和其他可能的方法可以在Pranay Rana的以下文章中找到:
CodeProject : DistinctBy in Linq (Find Distinct object by Property)
答案 1 :(得分:1)
我将分享解决方案,这个片段是更新包含当前进程(仅名称)的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)