Linq:基于属性值的拆分列表

时间:2018-02-08 15:34:08

标签: c# linq

当我必须基于属性值创建子列表时,我通常可以使用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>}

实现这一目标的最佳方式是什么?

1 个答案:

答案 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。结果是输入的一系列间隔,基于投影值的相等性。