2016-09-15 2 views
-1

각 요소가 정수 목록 인 List가 있습니다. 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 개의 목록을 포함하는 목록을 만들어 내 목록 정의 내가 목록에 올 때까지 그 계산은 처음부터 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이 없으면 MINIMUM 개수가 0인데 응답이 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

일부 예제 입력과 예상 출력을 표시 할 수 있습니까? – Jamiec

+0

귀하의 질의가 예상대로 작동하고 있습니다 - 당신은 처음에'== 0'에서 그것을 필터링하고 있기 때문에 빠져 나옵니다. – Jaya

+0

@JS_GodBlessAll - 쿼리가 잘못된 결과를 반환한다고 말하는 것은 아니지만 원하는 것은 아닙니다. 각 배열에서 0의 수를 계산하고 그 중 가장 낮은 수 (0 일 수 있음)를 반환합니다. – Cato

답변

3

당신은 그룹에 필요하지 않습니다이없는 경우 다음

var q = (from arr in prisoners select arr.Count(tally=>tally==0)).Min(); 
: 쿼리 식으로

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

4

문제

예는 더 제로가없는 경우는 내부 목록을 필터링하고, 따라서 올바른 최소 0를 할 수 없다. 이 문제를 해결하려면 다음을 수행하십시오. prisoners이 비어 있지으로

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

이 오래 작동합니다. 이 경우 예외가 발생합니다. 이 경우에도 결과를 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;