每个外部列表中所选项目的计数

本文关键字:项目 选项 外部 列表 | 更新日期: 2023-09-27 18:07:18

我有一个列表,其中每个元素是整数的列表。我想开发LINQ来计算每个列表中==到0的整数的数量。

定义列表

 var prisoners = new List<List<int>>(n);
 for (int c = 0; c < n; c++)
 {
     int[] l = new int[n];
     prisoners.Add(new List<int>());
     prisoners[c] = l.ToList<int>();
  }

所以我做了一个包含n个整数的n个列表的List,它们都是0 -我感兴趣的是每个列表中0的个数,特别是这个数的最小值,直到我开始处理这些列表时,它是n。

我想到了

var q = (from arr in prisoners from int tally in arr 
                        where tally == 0 
                        group arr by arr into grp select grp.Count()).Min();

现在的问题似乎是,当一个列表中没有零,它离开查询,我没有得到答案零。一开始我确实得到了答案'n'(当它们都是零时)-一旦列表中没有零,我就不会得到最小零计数的答案0。

如何在列表中包含的任何列表中找到0的最小计数?(最终将为零)。我需要这样做,以便所有的列表都进入分组,然后我计算有多少个零-但我不知道怎么做。

例子
int n = 3;
var prisoners = new List<List<int>>(n);
for (int c = 0; c < n; c++)
{
    int[] l = new int[n];
    prisoners.Add(new List<int>());
    prisoners[c] = l.ToList<int>();
}
//return 3 below - that is correct at this point
var q = (from arr in prisoners from int tally in arr where tally == 0 group arr by arr into grp select grp.Count()).Min();
prisoners[1] = (new int[] { 1, 1, 1 }).ToList();
prisoners[2] = (new int[] { 1, 1, 0 }).ToList();
//so now one of the arrays has zero zeroes in it, but I get the answer 1 - zero was wanted, that is to say 
//element 1 has a zero count of zero
q = (from arr in prisoners from int tally in arr where tally == 0 group arr by arr into grp select grp.Count()).Min();

每个外部列表中所选项目的计数

问题是,如果内部列表没有零,那么您将过滤掉它,因此您不会得到0作为正确的最小值。要解决这个问题,您可以执行以下操作。

var q = prisoners.Min(row => row.Count(x => x == 0));

只要prisoners不为空就可以工作。在这种情况下,它将抛出一个异常。如果您希望在这种情况下结果也为0,则可以执行以下操作:

var q = prisoners.DefaultIfEmpty().Min(row => row?.Count(x => x == 0)) ?? 0;

或者如果你没有c# 6

var q = prisoners.Any() ? prisoners.Min(row => row.Count(x => x == 0)) : 0;

你不需要分组:

var q = prisoners.Min(arr=>arr.Count(tally=>tally==0));

作为查询表达式:

var q = (from arr in prisoners select arr.Count(tally=>tally==0)).Min();