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代表全局唯一标识符,所以它实际上是唯一的