简体   繁体   中英

LINQ Expression - Same value no more than twice

I have an extracted list which contains only numbers whose addition is greater than 80 and also filtered to 10 random numbers.

How to ensure that the same value does not occur more than twice in the list of 4 numbers?

So { 20, 20, 20, 5 } would not be ok but { 20, 5, 20, 3 } would be fine.

I've tried using Distinct but it seems it ensure that the entire list is unique, not what I need.

var numList = new List<int> { 5, 20, 1, 7, 19, 3, 15, 60, 3, 21, 57, 9 };

var extractedList = (from n1 in numList
                     from n2 in numList
                     from n3 in numList
                     from n4 in numList
                     where n1 + n2 + n3 + n4 > 80
                     select new { n1, n2, n3, n4, Rnd = rnd.NextDouble() })
                     .OrderBy(z => z.Rnd)
                     .Take(10)
                     .ToList();

You could create an array of the selected values, group them, and check that each group has no more than two members.

For example:

    var extractedList = (from n1 in numList
                         from n2 in numList
                         from n3 in numList
                         from n4 in numList
                         where n1 + n2 + n3 + n4 > 80 && 
                             new int[]{n1, n2, n3, n4}
                                 .GroupBy(x => x)
                                 .Max(g => g.Count()) <= 2 
                         select new { n1, n2, n3, n4, Rnd = rnd.NextDouble() })
                         .OrderBy(z => z.Rnd)
                         .Take(10)
                         .ToList();

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