将一系列元素合并到定义数量的块 C#

Merge a sequence of elements into a defined number of blocks C#

我需要创建一个方法 Package<T>,给定一系列类型为 Tint nT default 的接口,将n+1 块中的序列,这样我就可以在每个块的第一个元素(即接口)上调用一个方法,并将每个块的其他 n 个接口的内部元素用作该方法的参数。如果有一个块没有足够的参数可以使用,那么必须使用 default 来填充块。

让我们用整数做一个例子。假设我有一个接口 IMyInterface<int>,它使用 sum 作为要调用的方法。 s 是十二个 IMyInterface 的序列,每个接口分别包含前 12 个整数中的一个,从 0 开始(因此 [0-11])。我的 Package 方法的其他参数是 n=3 和 default=20.

那么我期待的是一个包含 3 个整数的列表:6(即 = 0+1+2+3)、22(即 = 4+5+6+7)、38(即= 8+9+10+11)。 (不使用默认值)。

如果 n==4 它会改变,我希望得到一个包含 3 个整数的列表:10 (0+1+2+3+4)、35(5+6+7+8+9)、81(10 +11+20+20+20)(此处默认用于填充最后一个块剩余的三个整数)。

方法如下:

IEnumerable <T> Package <T >( IEnumerable < IMyInterface<T>> sequence , int n, T default )

这是界面:

public interface IMyInterface <T>
{
    T MergeWith ( params T[] others );
    T InnerElem { get; }
}

我希望这个解释足以理解我的问题。

解决方案可能如下所示:

public interface IMyInterface<T>
{
    T MergeWith(params T[] others);
    T InnerElem { get; }
}

public class C : IMyInterface<int>
{
    public C(int elem)
    {
        InnerElem = elem;
    }

    public int MergeWith(params int[] others)
    {
        return others.Sum() + InnerElem;
    }

    public int InnerElem { get; private set; }
}

class Program
{
    static void Main(string[] args)
    {
        var items = Enumerable.Range(0, 12).Select(x => new C(x));

        foreach (var item in Package(items, 4, 20))
        {
            Console.WriteLine(item);
        }
    }

    static IEnumerable<T> Package<T>(
        IEnumerable<IMyInterface<T>> sequence, 
        int n, T def)
    {
        return sequence
            .Select((x, ix) => new { item = x, ix })
            .GroupBy(x => x.ix / (n+1))
            .Select(x =>
            {
                var first = x.First().item;
                var others = x.Skip(1).Select(z => z.item.InnerElem);
                var missing = n - others.Count();
                var missingItems = Enumerable.Range(0, missing).Select(_ => def);

                return first.MergeWith(others.Concat(missingItems).ToArray());
            });
    }
}