linq 从IE中获取非独特元素

u0sqgete  于 2023-11-14  发布在  其他
关注(0)|答案(4)|浏览(103)

我有一个名为Item的类。Item有一个名为ItemCode的标识符属性,它是一个字符串。我想获得一个Item列表中所有非独特Item的列表。
范例:

List<Item> itemList = new List<Item>()
{
   new Item("code1", "description1"),
   new Item("code2", "description2"),
   new Item("code2", "description3"),
};

字符串
我想要一份名单,
如果我用

var distinctItems = itemsList.Distinct();


我得到了一个不同元素的列表,这很好,但我想要的几乎是相反的,我可以从原始列表中减去不同的列表,但这不会包含所有的重复,只是每个重复的一个示例。
我有一个发挥,不能想出一个优雅的解决方案。任何指针或帮助将不胜感激。谢谢!
我有3.5所以LINQ是可用的

lp0sw83n

lp0sw83n1#

我的看法是:

var nonDistinctItems = 
    from list in itemsList
    group list by list.ItemCode into grouped
    where grouped.Count() > 1
    select grouped;

字符串

bt1cpqcv

bt1cpqcv2#

作为扩展方法:

public static IEnumerable<T> NonDistinct<T, TKey> (this IEnumerable<T> source, Func<T, TKey> keySelector)
{
   return source.GroupBy(keySelector).Where(g => g.Count() > 1).SelectMany(r => r);
}

字符串

myzjeezk

myzjeezk3#

您可能想尝试使用group by操作符。其想法是按ItemCode对它们进行分组,并将具有多个成员的组,类似于:

var grouped = from i in itemList
              group i by i.ItemCode into g
              select new { Code = g.Key, Items = g };

var result = from g in grouped 
             where g.Items.Count() > 1;

字符串

ulmd4ohb

ulmd4ohb4#

我建议写一个自定义的扩展方法,类似这样:

static class RepeatedExtension
{
    public static IEnumerable<T> Repeated<T>(this IEnumerable<T> source)
    {
        var distinct = new Dictionary<T, int>();
        foreach (var item in source)
        {
            if (!distinct.ContainsKey(item))
                distinct.Add(item, 1);
            else
            {
                if (distinct[item]++ == 1) // only yield items on first repeated occurence
                    yield return item;
            }                    
        }
    }
}

字符串
您还需要为Item类重写Equals()方法,以便通过其代码正确地比较项。

相关问题