将序列分成若干块的辅助类 ChunkHelper

 
  
/// <summary>
/// ChunkHelper 帮助将序列分成若干块。
///
/// 如果 totalItemCount 是 11,chunkSize 是 5,则:
/// chunk[0] 0, 1, 2, 3, 4
/// chunk[1] 5, 6, 7, 8, 9
/// chunk[2] 10
/// </summary>
public class ChunkHelper
{
/// <summary>
///
/// </summary>
/// <param name="totalItemCount"> 项目总数 </param>
/// <param name="chunkSize"> 块大小 </param>
public ChunkHelper( int totalItemCount, int chunkSize)
{
if (totalItemCount < 0 )
{
throw new ArgumentOutOfRangeException( " itemCount " , totalItemCount, " itemCount 不能小于 0 " );
}
if (chunkSize < 1 )
{
throw new ArgumentOutOfRangeException( " chunkSize " , chunkSize, " chunkSize 不能小于 1 " );
}
this .TotalItemCount = totalItemCount;
this .ChunkSize = chunkSize;

int i = this .TotalItemCount % this .ChunkSize == 0 ? 0 : 1 ;
this .ChunkCount = this .TotalItemCount / this .ChunkSize + i;

}

/// <summary>
/// 获取项目总数。
/// </summary>
public int TotalItemCount { get ; private set ;}

/// <summary>
/// 获取块大小。
/// </summary>
public int ChunkSize { get ; private set ; }


/// <summary>
/// 指定项目索引,获取此项目所属的分块索引。
/// </summary>
/// <param name="itemIndex"></param>
/// <returns></returns>
public int GetChunkIndex( int itemIndex)
{
if (itemIndex < 0 || itemIndex >= TotalItemCount)
{
throw new ArgumentOutOfRangeException();
}

return itemIndex / ChunkSize;
}

/// <summary>
/// 获取分块数量,如果 TotalItemCount 为 0, 则返回值为 0,而不是 1。
/// </summary>
public int ChunkCount { get ; private set ;}


/// <summary>
/// 获取指定的分块信息。
/// </summary>
/// <param name="chunkIndex"></param>
/// <returns></returns>
public Chunk GetChunk( int chunkIndex)
{
if (chunkIndex < 0 || chunkIndex >= ChunkCount)
{
throw new ArgumentOutOfRangeException();
}

int startItemIndex = chunkIndex * ChunkSize;
int itemCountInChunk = ChunkSize;

// 如果大于项目总数,则是最后一块
if (startItemIndex + itemCountInChunk > TotalItemCount)
{
itemCountInChunk
= TotalItemCount % ChunkSize;
}
return new Chunk(chunkIndex, startItemIndex, itemCountInChunk);
}

}


/// <summary>
/// Chunk 表示一个分块。
/// </summary>
public struct Chunk
{
/// <summary>
/// 本块的索引。
/// </summary>
public int ChunkIndex { get ; private set ;}

/// <summary>
/// 本块第一个项目在整个序列中的索引。
/// </summary>
public int FirstItemIndex{ get ; private set ;}

/// <summary>
/// 本块的项目数。
/// </summary>
public int ItemCount { get ; private set ;}

/// <summary>
/// 实例化 Chunk
/// </summary>
/// <param name="chunkIndex"></param>
/// <param name="firstItemIndex"></param>
/// <param name="itemCountInChunk"></param>
internal Chunk( int chunkIndex, int firstItemIndex, int itemCountInChunk)
:
this ()
{
this .ChunkIndex = chunkIndex;
this .FirstItemIndex = firstItemIndex;
this .ItemCount = itemCountInChunk;
}
}

转载于:https://www.cnblogs.com/illusion/archive/2011/04/13/2014985.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值