Vb.net LINQ+;查找非空值的计数

Vb.net LINQ+;查找非空值的计数,vb.net,linq-to-sql,Vb.net,Linq To Sql,我有一张结构如下的桌子 ID值 1.3.2 2空 4空 5空 7空 10.1.8 11空 12.3.2 15.4.7 17空 22空 24空 25空 27空 287 我想获得表中连续空值的最大计数 任何帮助都将不胜感激 谢谢 Ashutosh这张桌子真的有意义吗 我认为要做到整洁,您需要一个分组操作符,它的工作方式不同于GroupBy,类似于groupcontinuoused,因此,如果它们具有相同的键,则所有单独的组都将保持独立,而不是合并 不幸的是,我的VB已经锈迹斑斑,根本不存在,但您可以

我有一张结构如下的桌子

ID值
1.3.2
2空
4空
5空
7空
10.1.8
11空
12.3.2
15.4.7
17空
22空
24空
25空
27空
287

我想获得表中连续空值的最大计数

任何帮助都将不胜感激

谢谢
Ashutosh

这张桌子真的有意义吗

我认为要做到整洁,您需要一个分组操作符,它的工作方式不同于
GroupBy
,类似于
groupcontinuoused
,因此,如果它们具有相同的键,则所有单独的组都将保持独立,而不是合并

不幸的是,我的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;

    }
}
这里的表被视为
IEnumerable
,所以这一切都发生在内存中


如果是这样的话,您最好在原始SQL中执行此操作。

您可以一直以艰难的方式执行此操作,并在返回集合后简单地对其进行循环

简单算法

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,但我不确定它在这里如何使用。正如我所说的,总有人可以通过抛出一行程序的方法来让我闭嘴。

那么(恐怕是这样的):

换句话说,我们始终保持当前计数和最大值。提醒你,这太可怕了。它似乎与您提供的示例数据一起工作,但是


请注意,我不确定这是否适用于LINQtoSQL。请注意,您需要在排序变得有意义之前指定它-数据库表是“集合”,没有连续值的概念。

@Jon-我意识到我在编写该表达式的中途完全没有抓住问题的关键!嗯,这张桌子实际上不太整齐。它有一个ID字段,但有时我们确实从表中删除了记录,因此,表中的值可以是非连续的。是否有其他有区别的字段,或者实际上是您所有的?
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
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;