我建议您按照其他人的建议,使用列表。 使用“capacity”构造函数可以提高性能:
var list = new List<string>(183);
然后,每当您获得一个新的数组时,请执行以下操作(用您用于填充数组的任何值替换“ ”):
list.Clear();
list.AddRange(array);
if (array.Length < 183)
list.AddRange(Enumerable.Repeat(" ", 183 - array.Length));
这样,列表始终在重复使用同一内部数组,减少了分配和垃圾回收的压力。
或者,您可以使用扩展方法:
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);
最后,这是我开始撰写这篇答案时的一个相当繁琐的想法:您可以将数组包装在一个IList实现中,该实现保证具有183个索引(为简洁起见,我省略了大多数接口成员实现):
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)
{
_array = array;
_constantSize = constantSize;
_padValue = padValue;
}
private int MissingItemCount
{
get { return _constantSize - _array.Length; }
}
public IEnumerator<T> GetEnumerator()
{
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(); }
}
}
确认。
List<string>
而不是数组? - PiousVenomforeach
循环不起作用吗? - Dave ZychList<>
,因为根本不需要填充。它比数组更好,因为它可以动态地改变大小以适应所需的任何大小。 - PiousVenomList<>
,都不能满足这个要求。 - Steve