LINQ查询不同的问题

时间:2014-09-27 01:04:04

标签: .net vb.net winforms linq telerik

我需要执行此查询:

  

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)

2 个答案:

答案 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)