そのためにリストを使用することの何が問題になっていますか?これはIListの実装に他ならず、自分でパーティショニングを行うことができます。しかし、透過的に実行したい場合は、次のようにします。
IListを実装し(これは単なるインターフェイスであり、特別なことは何もありません。質問がわからないのではないでしょうか?)、希望のサイズの配列でバックアップします。Get()
次に、目的のアイテムindex / sizeOfArrays
を含む配列のインデックスとして取得し、index % sizeOfArrays
その配列のthアイテムを返します。
楽しみのために、それは怠惰な金曜日なので、私は何かを書きました。ノート:
- 私はそれをテストしませんでした
- これがメモリの断片化を回避するのに役立つかもしれないというあなたの引用された主張の正しさについてコメントすることはできません、私はあなたの要求を盲目的に見ました
- リストや他のコレクションがすでにそれを行うのに十分賢いのかどうかはわかりません
- 私はあなたに適さないかもしれないいくつかの決定をしました(つまり、現在配列を使用している場合、これをコードに盲目的にドロップすることはできません。
Item
たとえば、実装、特にセッターを見てください
そうは言っても、週末前のやる気を起こさせる赤字を減らした出発点はここにあります。親愛なる読者(またはOP)に演習としていくつかの興味深い方法を残しました。.;-)
public class PartitionList<T> : IList<T> {
private readonly int _maxCountPerList;
private readonly IList<IList<T>> _lists;
public PartitionList(int maxCountPerList) {
_maxCountPerList = maxCountPerList;
_lists = new List<IList<T>> { new List<T>() };
}
public IEnumerator<T> GetEnumerator() {
return _lists.SelectMany(list => list).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
public void Add(T item) {
var lastList = _lists[_lists.Count - 1];
if (lastList.Count == _maxCountPerList) {
lastList = new List<T>();
_lists.Add(lastList);
}
lastList.Add(item);
}
public void Clear() {
while (_lists.Count > 1) _lists.RemoveAt(1);
_lists[0].Clear();
}
public bool Contains(T item) {
return _lists.Any(sublist => sublist.Contains(item));
}
public void CopyTo(T[] array, int arrayIndex) {
// Homework
throw new NotImplementedException();
}
public bool Remove(T item) {
// Evil, Linq with sideeffects
return _lists.Any(sublist => sublist.Remove(item));
}
public int Count {
get { return _lists.Sum(subList => subList.Count); }
}
public bool IsReadOnly {
get { return false; }
}
public int IndexOf(T item) {
int index = _lists.Select((subList, i) => subList.IndexOf(item) * i).Max();
return (index > -1) ? index : -1;
}
public void Insert(int index, T item) {
// Homework
throw new NotImplementedException();
}
public void RemoveAt(int index) {
// Homework
throw new NotImplementedException();
}
public T this[int index] {
get {
if (index >= _lists.Sum(subList => subList.Count)) {
throw new IndexOutOfRangeException();
}
var list = _lists[index / _maxCountPerList];
return list[index % _maxCountPerList];
}
set {
if (index >= _lists.Sum(subList => subList.Count)) {
throw new IndexOutOfRangeException();
}
var list = _lists[index / _maxCountPerList];
list[index % _maxCountPerList] = value;
}
}
}