簡體   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