2

我有一个要求,我需要从列表中过滤掉空值,只有当空值出现在第一个非空值之后和最后一个非空值之前。

Product one = new Product { Name="A" Priority="1" Value=null };
Product two = new Product { Name="A" Priority="2" Value=null };
Product three = new Product { Name="A" Priority="3" Value="10" };
Product four = new Product { Name="A" Priority="4" Value=null };
Product five = new Product { Name="A" Priority="5" Value="20" };
Product six = new Product { Name="A" Priority="6" Value=null };

在示例中,我需要首先根据产品的优先级对产品列表进行排序,然后检查第一个非空值(即优先级 3)和最后一个非空值(即优先级 5),然后获取列表在优先级 3 和 5 内具有空值的所有产品中。因此,在我们的示例中,只有具有优先级 4 的产品 4 是我要查找的记录。我开始按产品对它们进行实际分组并按优先级对它们进行排序,但在那之后一直坚持如何进行

from p in Products
group p by p.Product into grp
select new
{
   Product = grp.Key
   Values = grp.OrderBy(x => x.Priority)
}

有人可以指点我如何进行吗?我在想我可以使用索引来识别所有非空值并迭代以获取最小和最大优先级值,然后查询在最小/最大优先级内具有空白空值的所有记录。

4

2 回答 2

2

如果您确定哪些值是组中的起点和终点并从那里过滤,那将会更容易和更有效。

var query =
    from product in Products
    group product by product.Name into g
    let ordered = g.OrderBy(p => p.Priority).ToList()
    let firstIndex = ordered.FindIndex(p => p.Value != null)
    let lastIndex = ordered.FindLastIndex(p => p.Value != null)
    select new
    {
        Product = g.Key,
        Values = ordered
            .Skip(firstIndex + 1)
            .Take(lastIndex - firstIndex - 1)
            .Where(p => p.Value == null),
    };
于 2012-07-25T19:06:08.383 回答
1

怎么样(您可以使用.Select而不是.SelectMany为每个产品获取单独的组。 .SelectMany将所有有效结果记录组合到一个列表中):

Products
    .GroupBy(p => p.Name)
    .SelectMany (grp =>
        grp.OrderBy(p => p.Priority)           // sort by priority
            .SkipWhile(p => p.Value == null)   // skip null entries at beginning
            .Reverse()                         // reverse
            .SkipWhile(p => p.Value == null)   // skip null entries at end
            .Reverse()                         // reverse back to normal
            .Where(p => p.Value == null)       // then find null entries
    );

演示:http: //ideone.com/2dU9L

于 2012-07-25T18:10:36.603 回答