C# 仅当为true时才使用LINQ GroupBy()

C# 仅当为true时才使用LINQ GroupBy(),c#,C#,我需要使用自定义条件对数据进行分组,该条件返回true或false。复杂性在于,我只需要对返回true的项进行分组,而不对其他项进行分组 如果我使用: var result = data.GroupBy(d => new { Condition = d.SomeValue > 1 }); 所有项目按true/false分组 现在我有一个有效的说法: var result = data.GroupBy(d => new { Condition = d.SomeValue >

我需要使用自定义条件对数据进行分组,该条件返回
true
false
。复杂性在于,我只需要对返回
true
的项进行分组,而不对其他项进行分组

如果我使用:

var result = data.GroupBy(d => new { Condition = d.SomeValue > 1 });
所有项目按
true
/
false
分组

现在我有一个有效的说法:

var result = data.GroupBy(d => new { Condition = d.SomeValue > 1 ? "true" : FunctionToGetUniqueString() });
更新:注意,其他项目(为
false
)也必须在分组中,但必须单独进行(每组一个)


但我认为这是一个有点脏的解决方案,所以我想也许有更优雅的方法?

最简单的方法是这样:

var result = data
    .GroupBy(d => d.SomeValue > 1 ? 0 : d.ID);
var result = data
    .Select((d, i) => new { d, i })
    .GroupBy(x => x.d.SomeValue > 1 ? -1 : x.i, x => x.d);
var result = data.GroupWhere(d => d.SomeValue > 1);
假设
ID
是一个
int
属性,该属性在集合中的项目中是唯一的。当然,如果您具有唯一的字符串属性等,则可以非常轻松地使用此技术。如果您没有唯一属性,则始终可以执行以下操作:

var result = data
    .GroupBy(d => d.SomeValue > 1 ? 0 : d.ID);
var result = data
    .Select((d, i) => new { d, i })
    .GroupBy(x => x.d.SomeValue > 1 ? -1 : x.i, x => x.d);
var result = data.GroupWhere(d => d.SomeValue > 1);
这将在LINQto对象中起作用,但我不确定其他Linq提供程序(例如,LINQtoSQL、LINQtoEntities)。对于这些情况,D Stanley可能是唯一的方法,但对于简单的Linq查询,这将比为每个非分组项生成随机
Guid
更有效

当然,如果这看起来不美观,您可以用扩展方法来包装它。请注意,我返回的是
IEnumerable
,而不是
IEnumerable
,因为这里的键实际上与此无关:

public static IEnumerable<IEnumerable<T>> GroupWhere<T>(
    this IEnumerable<T> set,
    Func<T, bool> grouping)
{
    return set
        .Select((d, i) => new { d, i })
        .GroupBy(x => grouping(x.d) ? -1 : x.i, x => x.d);
}

我认为你的解决方案有效;我只想补充详细的评论来解释预期的结果

如果要使用“内置”字符串生成器而不是创建自己的字符串生成器,可以使用
Guid.NewGuid()

此外,您不需要匿名类型,除非以后要使用
条件
值:

var result = data.GroupBy(d => d.SomeValue > 1 
                               ? Guid.Empty 
                               : Guid.NewGuid() )

我认为你的解决方案有效;我只想添加详细的注释来解释预期的结果。这不是分组查询。这是一个简单的
Where
过滤器。还是我遗漏了什么?OP仍然想要不符合条件的结果;只是不分组我认为
Guid.NewGuid()
是个好主意,但是我建议使用
Guid.Empty
而不是
“\u true”
作为与条件不匹配的项的键是否保证
Guid.NewGuid()
始终返回唯一的字符串?
Guid.NewGuid()
将返回
Guid
,不是
字符串
。是的,它应该总是返回一个唯一的value@net_progGUID代表全局唯一标识符,所以它实际上是唯一的