【问题标题】:LINQ query Distinct issueLINQ 查询不同的问题
【发布时间】:2014-09-27 01:04:03
【问题描述】:

我需要执行这个查询:

1) 列出进程

2) 按名称排序

3) 消除重复名称

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

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

如何修复/改进此查询?

 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 来选择进程名称然后区分它们,但是如果我这样做了后续的 @ 987654325@语句接收的是String而不是进程...

我该如何解决?,我真的只会在 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)

【问题讨论】:

  • 你能分享你使用的代码Distinct吗?
  • 当然可以,如果有必要的话,但是很抱歉,我不明白你的意思是代码的哪一部分,你能说得更具体些吗?,我尝试在“Order By”之后使用“Distinct”之前,在 LINQ 查询中,因为我需要在“选择”语句之前消除重复的进程名称。这只能在 1 个查询中完成?

标签: .net vb.net winforms linq telerik


【解决方案1】:

您可以使用 Jon Skeet 的 3rd 方库中的 DistinctBy() 方法; MoreLINQ

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

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

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

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

CodeProject : DistinctBy in Linq (Find Distinct object by Property)

【讨论】:

  • 谢谢...很高兴发现新的库,它也是一个像其他任何解决方案一样的解决方案,我真的不会假装冒犯你,但是,安装一个由谁知道并依赖于编写的 3rd 方库项目中的那个库只是为了从 1 个小且有问题的查询中解救出来,这似乎不是一个好方法,我不会向像我这样处于相同情况的任何人推荐这种方法。另一方面,如果我认为它可能更好地用于需要执行此问题数千次不同时间的情况,那么该库可能会很棒。谢谢你的回答
  • 是否选择 3rd 方库完全取决于您,因为这取决于许多因素只有您自己知道,但我发现有人在像您这样的情况下为 OP 推荐它(例如 this recent questionwhat Jon Skeet him self did)。无论如何,您的评论证明我采取了正确的步骤,没有停留在第一个建议上,除了使用 MoreLINQ 之外,还有另外 2 种方法
  • 谢谢你在第一个 url 的最后一个答案中建议的解决方案解决了我的问题(分组然后选择组中的第一项),我知道这不是更有效的方法,因为 LINQ 似乎是有点慢(一般),但对我的需求来说并不重要,再次感谢
【解决方案2】:

我将分享解决方案,此 sn-p 用于更新包含当前进程(仅名称)的 RadListControl(Telerik 用于 winForms 的控制套件)的数据源:

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)

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多