首页 > 解决方案 > 如何查找(分组的)键的一部分是否在列表中多次出现?

问题描述

假设我想找出哪个 eprt_id 出现了两次。(在这种情况下是:20463)

Eprt_id: 21487 Perceel: Test
               subject: Apples
 
Eprt_id: 21696 Perceel: Test2
               subject: Oranges

Eprt_id: 21822 Perceel: Test3
               subject: Pears

Eprt_id: 23485 Perceel: Test4
               subject: Lemons

Eprt_id: 24238 Perceel: Test55
               subject: Watermelons
               subject: Oranges

Eprt_id: 20463 Perceel: Test56
               subject: Apples
               subject: Pears

Eprt_id: 20463 Perceel: Test57
               subject: Apples
               subject: Pears

这个列表显然是 Eprt_id 和 Perceel 上的一组。

但是我怎样才能写一个像样的 linq 语句,让我得到结果(在这种情况下) 20463 不止一次出现?

我得到这个列表如下:

var nextGroupedWorklist = from r in SubtractBSNlessFromWerklijst
                where r.Eprt_id.HasValue &&
                    !string.IsNullOrEmpty(r.Subject_id) &&
                    !string.IsNullOrEmpty(r.Perceel_id) &&
                    !string.IsNullOrEmpty(r.Hermes_dossier_nr) &&
                    !string.IsNullOrEmpty(r.Gogis_perceel_nr)
                group r by new { r.Eprt_id, r.Gogis_perceel_nr };

我认为一个简单的计数就可以了。但它显然会返回组元素的计数。

我找到了获得 20463 的方法。但这是最好的方法吗?

 var solution = from r in nextGroupedWorklist
    group r by new { r.Key.Eprt_id }
    into grp
    where grp.Count() > 1
    select grp;

其次,有没有一种聪明的方法来检查两个主题是否相同?(如示例中所示)两个 20463 eprt_id 都包含主题:Apples and Pears。这是一个示例列表(如您所见,每个 20463 在 2 个不同的 Perceel 列中都有两个相同的主题)所以这就是我要检查的内容。如果两者相同。我可以继续处理 20463。否则不会。:

 Eprt_id: 20229 Perceel: WPK02L1072G0 subject: NL.KAD.Persoon.255545276 
 Eprt_id: 20267 Perceel: WPK02L1051G0 subject: NL.KAD.Persoon.255545276 
 Eprt_id: 20463 Perceel: ASD31AL2317G0 subject: NL.KAD.Persoon.170412796
 Eprt_id: 20463 Perceel: ASD31AL2317G0 subject: NL.KAD.Persoon.455686300
 Eprt_id: 20463 Perceel: ASD31AL3076G0 subject: NL.KAD.Persoon.170412796
 Eprt_id: 20463 Perceel: ASD31AL3076G0 subject: NL.KAD.Persoon.455686300
 Eprt_id: 20524 Perceel: ASD31AL952G0 subject: NL.KAD.Persoon.170348494 
 Eprt_id: 20524 Perceel: ASD31AL952G0 subject: NL.KAD.Persoon.171028089 
 Eprt_id: 20939 Perceel: WPK02L260G0 subject: NL.KAD.Persoon.171510661 
 Eprt_id: 20939 Perceel: WPK02L260G0 subject: NL.KAD.Persoon.171510669 
 Eprt_id: 20944 Perceel: WPK02L6672G0 subject: NL.KAD.Persoon.171510661
 Eprt_id: 20944 Perceel: WPK02L6672G0 subject: NL.KAD.Persoon.171510669 
 Eprt_id: 21487 Perceel: WPK02L2503G0 subject: NL.KAD.Persoon.170459916 
 Eprt_id: 21696 Perceel: ASD02A7343A61 subject: NL.KAD.Persoon.171440573
 Eprt_id: 21822 Perceel: WPK02L1602G0 subject: NL.KAD.Persoon.459669099 

标签: c#linq

解决方案


List<(int eprt, int count)> duplicates = SubtractBSNlessFromWerklijst
    .Where( r => r.Eprt_id.HasValue )
    .GroupBy( r => r.Eprt_id.Value )
    .Where( grp => grp.Count() > 1 )
    .Select( grp => ( eprt: grp.Key, count: grp.Count() ) )
    .ToList();

这将为您提供以下输出:

[
    ( eprt: 20463, count: 2 )
]

其次,有没有一种聪明的方法来检查两个主题是否相同?

我们无法帮助您,因为您还没有发布任何类型的定义subject。您的示例输入数据没有解释对象图的结构。


推荐阅读