当我必须基于属性值创建子列表时,我通常可以使用GroupBy扩展方法。
但是现在我必须创建基于属性值的组,但要保持原始顺序,以便多个组具有相同的键。
作为示例,前提是对于每个元素,相关属性具有以下值
{0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 2, 2, 2}
我需要在输出中有5个单独的组,
{0: <three objs>}
{1: <two objs>}
{0: <two objs>}
{1: <three objs>}
{2: <three objs>}
实现这一目标的最佳方式是什么?
答案 0 :(得分:1)
显然,您有兴趣根据相同的属性值创建间隔。这可以使用以下扩展方法完成。
public static IEnumerable<IEnumerable<T>>
Intervals<T, R>(this IEnumerable<T> Input, Func<T, R> f)
where R : IEquatable<R>
{
if (0 != Input.Count())
{
var CurrentValue = f(Sequence.First());
Func<T, bool> IntervalPredicate = iEl => f(iEl).Equals(CurrentValue);
return new IEnumerable<T>[]
{Input.TakeWhile(IntervalPredicate)}
.Concat(Input.SkipWhile(IntervalPredicate).Intervals(f));
}
else
{
return Enumerable.Empty<IEnumerable<T>>();
}
}
参数f
用于将序列Input
中的每个对象投影到其所需的propoerty。结果是输入的一系列间隔,基于投影值的相等性。