确定集合中是否有n个实例值

时间:2015-09-21 17:42:44

标签: c# linq

我的List<int>值{1,2,1,5,4,1},只有更长的时间。我想测试列表中是否存在相同值的 n 实例 - 任何值。例如,如果我有bool duplicateCount(int n, IEnumerable<int> collection)之类的函数,请使用上面的列表:

  

duplicateCount(4,list); //假

     

duplicateCount(3,list); //是的,因为有3x&#39; 1&#39;

过去我会通过构建Dictionary<int, int>并计算每个成员的实例来解决这样的问题。但是,为了帮助我学习Linq,我想尝试使用该技术实现解决方案。

我编写了一个使用groupby的查询,但是我在获取每个组中的元素数量时遇到了问题。关于如何在这里进行的任何建议?

var q = from i in list group i by i into g select g.Count();

2 个答案:

答案 0 :(得分:4)

您可以使用GroupBy执行此操作,然后检查Any群组Count是否大于或等于数字

public bool duplicateCount(int n, IEnumerable<int> collection)
{
    return collection.GroupBy(x => x).Any(g => g.Count() >= n)
}

如果您想确定是否有任何值重复n次,请执行以下操作。

public bool duplicateCount(int n, IEnumerable<int> collection)
{
    return collection.GroupBy(x => x).Any(g => g.Count() == n)
}

还有查询语法,但我认为在这种情况下,方法语法看起来更好,特别是因为你无法将Any翻译成查询语法。

public bool duplicateCount(int n, IEnumerable<int> collection)
{
    return (from item in collection
            group by item into grp
            select grp.Count()).Any(count => count == n)
}

答案 1 :(得分:0)

lambda表达式以外的东西

 List<int> list = new List<int>() { 1, 2, 3, 3, 3, 4, 4, 4, 4,2,2,2, 2, 2, 2, 5, 5, 5, 5 };

        var q = (from i in list
                 where i == 2
                 select i).Count();