2010-04-02 3 views
1

다음과 같은 구조의 테이블이 있습니다.LINQ + null이 아닌 값의 개수를 찾으십시오.

ID 값
1 3.2
2 NULL
4 NULL
5 NULL
7 NULL
10 1.8
11 NULL
12 3.2
15 4.7
17 NULL
22 NULL
24 NULL
25 NULL
(27) NULL
28 7

나는 테이블에 연속 null 값의 최대 수를 좀하고 싶습니다.

도움을 주시면 감사하겠습니다.

감사 아슈

+0

다른 식별 필드가 있습니까, 아니면 문자 그대로 있습니까? – SteadyEddi

답변

0

정말 의미있는 방식으로 주문 테이블인가?

나는 GroupConsecutive과 같은 식으로 GroupBy과 다르게 작동하는 그룹화 연산자가 필요하다고 생각합니다. 그래서 모든 별도의 그룹은 동일한 키가있는 경우 결합되지 않고 별도로 유지됩니다.

는 불행하게도 내 VB는 녹슨 - 투 - 존재하지 않는,하지만 당신은 정신이 변환 할 수 있습니다

이제
public static class X 
{ 
    private class Grouping<K, V> : List<V> 
    { 
     public K Key { get; set; } 
    } 

    public static IEnumerable<IGrouping<TKey, TValue>> GroupConsecutive(
     this IEnumerable<TSource> source, 
     Func<TSource, TKey> keySelector) 
    { 
     Grouping current = null; 

     foreach (var elem in source) 
     { 
      var key = keySelector(elem); 
      if (current == null || !current.Key.Equals(key)) 
      { 
       if (current != null) 
        yield return current; 
       current = new Grouping { Key = key }; 
      } 

      current.Add(elem); 
     } 

     if (current != null) 
      yield return current; 

    } 
} 

당신이 말할 수 있습니다 :

table.GroupConsecutive(r => r.Value).Where(g => g.Key == null).Max(g => g.Count); 

다음 표는 치료 중입니다 IEnumerable으로,이 모든 메모리에서 발생합니다.

원시 SQL에서 수행하는 것이 더 나을 수도 있습니다.

+0

그건 계산을하지 않을거야 ... –

+0

@ 존 - 내가 그 표현을 작성하는 중반에 있었을 때 나는 질문의 요점을 완전히 놓쳤다는 것을 깨달았다! –

0

언제든지이 작업을 수행하여 반환 된 컬렉션을 반복 할 수 있습니다.

간단한 알고리즘

for each item in collection 
    if element null 
     increment counter 
    if element not null 
     compare counter to existing max, update as necessary 
     reset counter 

display or otherwise use max 

내가 LINQ를 사랑하지만 내가 여기에 사용할 수있는 방법을 모르겠어요. 내가 말했듯이, 항상 따라 와서 한 줄짜리 방법을 버리면 바로 저를 막을 수있는 누군가가 있습니다.

+0

글쎄, 테이블 실제로 실제로 주문하지 않습니다. 그것은 ID 필드를 가지고 있지만 때때로 우리는 테이블에서 레코드를 지우므로 테이블은 비 연속적인 값을 가질 수 있습니다 – Ashutosh

0

방법에 대해 (C#을 난 두려워) : 우리는 함께 갈로

var count = data.Aggregate(new { tmp = 0, max = 0 }, (current, item) => 
    item.Value == null ? new { tmp = current.tmp + 1, 
           max = Math.Max(current.tmp + 1, current.max) } 
         : new { tmp = 0, current.max }).max; 

즉, 우리는 항상 현재의 수와 최대 값을 유지한다. 꽤 끔찍한 생각 이네. 비록 당신이 주어진 예제 데이터와 함께 작동하는 것 같습니다 ...

나는 그것이 LINQ to SQL과 함께 작동 할 것인지는 잘 모르겠다. 순서가 지정되기 전에 순서를 지정해야합니다. 데이터베이스 테이블은 연속적인 값의 개념없이 "집합"됩니다.

관련 문제