将一系列元素合并到定义数量的块 C#
Merge a sequence of elements into a defined number of blocks C#
我需要创建一个方法 Package<T>
,给定一系列类型为 T
、int n
和 T 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());
});
}
}
我需要创建一个方法 Package<T>
,给定一系列类型为 T
、int n
和 T 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());
});
}
}