c# - LINQ 表达式 - 相同值不超过两次

标签 c# linq

我有一个提取的列表,其中仅包含相加大于 80 的数字,并且还过滤为 10 个随机数。

如何确保相同的值在 4 个数字的列表中不会出现两次以上?

所以 { 20, 20, 20, 5 } 不行,但 { 20, 5, 20, 3 } 就可以了。

我尝试过使用Distinct,但它似乎确保整个列表是唯一的,而不是我需要的。

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

最佳答案

您可以创建所选值的数组,将它们分组,并检查每个组的成员是否超过两个。

例如:

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

关于c# - LINQ 表达式 - 相同值不超过两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23892289/

相关文章:

c# - Interop.xxxxx.dll 是如何生成的?

c# - [ThreadStatic] 的使用与异步代码不一致吗?

c# - 使用 LINQ 在两个表之间选择不同的值

c# - 如何使用 linq 仅对一列进行分组

c# - SQL 代码连接到一个由逗号分隔的键引用的表,并对其中的数据求和

linq group by with count

c# - 如何在不映射到 EF 上下文的情况下使用 DataAnnotations 属性验证模型?

c# - TransactionScope优先级(摆脱死锁情况)

C#:查找所有空的 catch block

c# - EF - AND NOT EXISTS (SELECT 1 ...) with Entity Framework