[英]How to divide an observable collection equally
我想将`tar'集合平均分配。 我有6个单独的集合,无论集合的大小如何,我都希望在6个列表中均匀地填充它们,例如,如果有23个项目,则6个列表应为4,4,4,4,4,最后3或24: 4,4,4,4,4和4
ObservableCollection<test> tar = new ObservableCollection<test>();
tar.Add(new test { name="a"});
tar.Add(new test { name = "b" });
tar.Add(new test { name = "c" });
tar.Add(new test { name = "d" });
tar.Add(new test { name = "e" });
tar.Add(new test { name = "f" });
tar.Add(new test { name = "g" });
tar.Add(new test { name = "h" });
tar.Add(new test { name = "i" });
tar.Add(new test { name="ae"});
tar.Add(new test { name = "br" });
tar.Add(new test { name = "cwr" });
tar.Add(new test { name = "dt" });
tar.Add(new test { name = "ef" });
tar.Add(new test { name = "ff" });
tar.Add(new test { name = "fg" });
tar.Add(new test { name = "hg" });
tar.Add(new test { name = "ie" });
我已经尝试了仅发现但不确定如何访问组的此功能。
ObservableCollection<ObservableCollection<test>> Split(ObservableCollection<test> collection, int splitBy = 3)
{
var result = collection
.Select((x, i) => new { index = i, item = x })
.GroupBy(x => x.index / splitBy, x => x.item)
.Select(g => new ObservableCollection<test>(g));
return new ObservableCollection<ObservableCollection<test>>(result);
}
您的情况听起来很像我写的批处理扩展名。 它获取一个集合,并返回这些项目的新集合,这些项目分为指定大小的批次。 返回的集合中的最后一批将剩下剩余的项目,因此它将没有剩余的项目那么多,您可以修改此代码来做到这一点,我现在也将对其进行处理(在下面编辑)。
public static IEnumerable<IEnumerable<TSource>> Batch<TSource>(this IEnumerable<TSource> items, int size)
{
return items.Batch(size, x => x);
}
public static IEnumerable<TResult> Batch<TSource, TResult>(this IEnumerable<TSource> items, int size,
Func<IEnumerable<TSource>, TResult> selector)
{
if (items == null)
throw new ArgumentException(nameof(items));
if (size <= 0)
throw new ArgumentOutOfRangeException(nameof(size));
if (selector == null)
throw new ArgumentNullException(nameof(selector));
using (var enumerator = items.GetEnumerator())
{
var taken = 0;
while (enumerator.MoveNext())
{
yield return selector(items.Skip(taken)
.Take(size));
for (int i = 0; i < size - 1; i++)
if (!enumerator.MoveNext())
break;
taken += size;
}
}
}
编辑:以下对批处理扩展名的修改对我有用。 您可能希望以不同的方式实现它,具体取决于您希望它如何填充最后一批。 我完成此操作的方式使用TSource的默认值,这对您来说是测试,默认值为null。
while (enumerator.MoveNext())
{
IEnumerable<TSource> batch;
batch = items.Skip(taken).Take(size);
var count = items.Count();
if (taken + size >= count)
batch = batch.Concat(Enumerable.Range(0, count - taken)
.Select(i => default(TSource)));
yield return selector(batch);
for (int i = 0; i < size - 1; i++)
if (!enumerator.MoveNext())
break;
taken += size;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.