2016-09-15 8 views
-1

У меня есть список, в котором каждый элемент представляет собой список целых чисел. Я хочу разработать 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 с самого начала.

я придумал

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» (когда все они равны нулю) - как только список не имеет нулей в нем, я не получаю нулевой ответ для MINIMUM count of zeroes.

Как найти минимальное количество нулей в любом из списков, содержащихся в списках? (который в конечном итоге будет равен нулю). Мне нужно сделать так, чтобы все списки вошли в группу, затем я подсчитываю, сколько нулей есть, но я не знаю, как это сделать.

Пример

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

Можете ли вы показать пример ввода и ожидаемого вывода? – Jamiec

+0

ваш запрос работает должным образом - он выходит из-за того, что вы сначала фильтруете его на '== 0', а затем подсчитываете. – Jaya

+0

@JS_GodBlessAll - я не говорю, что запрос возвращает ошибочные результаты, но это не то, что я хочу - я хочу подсчитать количество нулей в каждом массиве, а затем вернуть самый низкий из этих счетчиков (который может быть равен нулю) – Cato

ответ

3

Вам не нужно группировать:

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

В выражении запроса:

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

Проблема заключается в том, что вы отфильтровывая внутренний список, если он не имеет нулей и, таким образом, вы не получите 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; 
Смежные вопросы