如何在y列中尽可能均匀地分布x项?

时间:2014-06-05 20:02:22

标签: c#

我有一系列物品。我还有一些动态的列数可能会改变。

我需要一种算法,将我的项目重新分配到存储桶中,这样我就可以将它们绑定到UI。我想填写然后穿过,但是先填充宽度。

我喜欢最平坦和最矩形的'分发尽可能。

这种安排是错误的,因为它没有填充第9列。

            1 2 3 4 5 6 7 8 9

            A D G J M P S V
            B E H K N Q T 
            C F I L O R U

这种安排是正确的,虽然不太理想......

            1 2 3 4 5 6 7 8 9

            A D G J M P S U V
            B E H K N Q T
            C F I L O R

...而不是这个,在视觉上更加平衡。

            1 2 3 4 5 6 7 8 9

            A D G J M O Q S U
            B E H K N P R T V
            C F I L 

感谢。这是Q& A,我已经解决了。

1 个答案:

答案 0 :(得分:2)

这将使用“左侧偏见”来平衡存储桶中的项目。

    public static T[][] FillBucketsEvenly<T>(IEnumerable<T> items, int bucketCount)
    {
        int itemsPerBucket = items.Count() / bucketCount;
        int countOfBucketsTakingExtraOne = items.Count() % bucketCount;

        T[][] buckets = new T[bucketCount][];

        // Build empty array structure.

        for (int i = 0; i < bucketCount; i++)
        {
            if (i < countOfBucketsTakingExtraOne)
            {
                buckets[i] = new T[itemsPerBucket + 1];
            }
            else
            {
                buckets[i] = new T[itemsPerBucket];
            }
        }

        // Fill the structure.

        int itemsAdded = 0;
        foreach(var bucket in buckets)
        {
            int grabSize = bucket.Count();

            var grab = items.Skip(itemsAdded).Take(grabSize);
            for (int i = 0; i < grabSize; i++)
            {
                bucket[i] = grab.ElementAt(i);
            }

            itemsAdded += grabSize;
        }

        return buckets;
    }