私はおそらく他の人の提案に従い、リストを使用します。パフォーマンスを向上させるには、「capacity」コンストラクターを使用します。
var list = new List<string>(183);
次に、新しい配列を取得するたびに、これを実行します (" " を、配列のパディングに使用する値に置き換えます)。
list.Clear();
list.AddRange(array);
// logically, you can do this without the if, but it saves an object allocation when the array is full
if (array.Length < 183)
list.AddRange(Enumerable.Repeat(" ", 183 - array.Length));
このようにして、リストは常に同じ内部配列を再利用し、割り当てと GC の負荷を軽減します。
または、拡張メソッドを使用できます。
public static class ArrayExtensions
{
public static T ElementOrDefault<T>(this T[] array, int index)
{
return ElementOrDefault(array, index, default(T));
}
public static T ElementOrDefault<T>(this T[] array, int index, T defaultValue)
{
return index < array.Length ? array[index] : defaultValue;
}
}
次に、次のようにコーディングします。
items.Zero = array[0];
items.One = array[1];
//...
これになります:
items.Zero = array.ElementOrDefault(0);
items.One = array.ElementOrDefault(1);
//...
最後に、これは私がこの回答を書き始めたかなり面倒なアイデアです。183 個のインデックスを持つことが保証されている IList 実装で配列をラップできます (簡潔にするために、ほとんどのインターフェイス メンバーの実装を省略しました)。
class ConstantSizeReadOnlyArrayWrapper<T> : IList<T>
{
private readonly T[] _array;
private readonly int _constantSize;
private readonly T _padValue;
public ConstantSizeReadOnlyArrayWrapper(T[] array, int constantSize, T padValue)
{
//parameter validation omitted for brevity
_array = array;
_constantSize = constantSize;
_padValue = padValue;
}
private int MissingItemCount
{
get { return _constantSize - _array.Length; }
}
public IEnumerator<T> GetEnumerator()
{
//maybe you don't need to implement this, or maybe just returning _array.GetEnumerator() would suffice.
return _array.Concat(Enumerable.Repeat(_padValue, MissingItemCount)).GetEnumerator();
}
public int Count
{
get { return _constantSize; }
}
public bool IsReadOnly
{
get { return true; }
}
public int IndexOf(T item)
{
var arrayIndex = Array.IndexOf(_array, item);
if (arrayIndex < 0 && item.Equals(_padValue))
return _array.Length;
return arrayIndex;
}
public T this[int index]
{
get
{
if (index < 0 || index >= _constantSize)
throw new IndexOutOfRangeException();
return index < _array.Length ? _array[index] : _padValue;
}
set { throw new NotSupportedException(); }
}
}
わかりました。