简体   繁体   中英

Determine if there are n instances of any value in a collection

I have a List<int> with values like { 1, 2, 1, 5, 4, 1 }, only much longer. I would like to test if there are n instances of the same value - any value - in the list. For example, if I had a function like bool duplicateCount(int n, IEnumerable<int> collection) , using the above list:

duplicateCount(4, list); // false

duplicateCount(3, list); // true, as there are 3x '1's

In the past I would resolve a problem like this by building a Dictionary<int, int> and count the instances of each member. However, in order to help me learn Linq, I would like to try to implement a solution with that technology.

I have written a query that uses groupby, below, but I'm having trouble getting the number of elements in each group. Any advice on how to proceed here?

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

You can do that with a GroupBy and then checking if Any group has a Count greater than or equal to the number

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

Or the following if you want to determine if there is any value repeated exactly n times.

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

There is also query syntax, though I think in this case method syntax looks better, especially since you cannot translate Any to query syntax.

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)
}

something other than lambda expressions

 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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM