繁体   English   中英

如何平均划分可观察的集合

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM