C# LINQ使用GroupBy处理空值

4

我有一个包含日期的对象:

class MyObj
{
   public DateTime? Date {get; set;}
}

正如你所见,Date是可空的。是否可能使用 LINQGroupBy 方法对包括 null 的日期在内的 List<MyObj> 进行分组?

想要得到这样的结果:{具有日期1的元素,具有日期2的元素,...,没有日期的元素}


1
是的,它只是有效运作。 - SimpleVar
有些 SQL 语言可以做到这一点。按组分组所有内容,甚至将空值放入一个袋子中。 - Nickon
你想要具有空日期值的MyObj列表吗?问题不清楚。 - Shankar
我觉得很清楚。他有一个对象列表,其中一些对象为空,并希望在该列表上使用 .GroupBy() 方法。 - Patrik
@PatrikEckebrecht - OP 特别询问了可为空的 Date 属性。他通过询问“包括 null 的日期”和“没有日期的元素”来明确这一点。最后一个问题不是“空元素”。 - Enigmativity
2个回答

9

测试并不是特别困难。这是我的代码:

var items = new []
{
    new MyObj() { Date = null },
    new MyObj() { Date = null },
    new MyObj() { Date = DateTime.Now },
};

var grouped = items.GroupBy(x => x.Date);

我得到了这个结果:

result

该结果是一个图片,无法提供更多解释。

1
GroupBy 方法是一个扩展方法,这意味着它是一个静态方法,接受您的日期作为参数。它的书写格式为 listWithNulls.GroupBy(),但实际上被视为 GroupBy(listWithNulls)。由于这种行为,可以处理 null 值,因此您不会遇到 NullReferenceException。请查看扩展方法的定义,这有助于了解如何使用它们:
public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);

您可以看到第一个参数被写成 this IEnumerable<TSource> source,这使得可以使用简短的方式 source.GroupBy()

5
你在这里说的一切都是正确的,但我不明白这如何回答问题? - Enigmativity
1
是的,但他在询问Date属性中的null值,而不是源可枚举对象。这就是为什么我提出了这个问题。 - Enigmativity
我明白你的意思。在这种情况下,这个问题就没有太多意义了,我们都不应该回答它,以便让它被删除。对此我感到抱歉。是的,我的回答针对的是列表项为空的情况。 - Patrik
1
你的回答是针对源可枚举对象是否为null的。该回答不适用于列表项为null的情况。如果元素为null,则keySelector谓词将失败。 - Enigmativity
让我们在聊天中继续这个讨论 - Patrik
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接