您可以使用以下ArraySegment<T>
结构:
for (int i = 0; i < threadsArray.Length; i++)
{
sub[i] = new ArraySegment<double>(full, i * 4, 4);
ArraySegment<double> tempSub = sub[i];
threadsArray[i] = new Thread(() => DoStuff(tempSub));
threadsArray[i].Start();
}
(请注意,您需要更改签名DoStuff
以接受一个ArraySegment<double>
(或至少一个IList<double>
而不是一个数组)
ArraySegment<T>
不复制数据;它只是表示数组的一部分,通过保留对原始数组的引用、偏移量和计数。由于 .NET 4.5 它实现了IList<T>
,这意味着您可以使用它而不必担心操作偏移量和计数。
在 .NET 4.5 之前的版本中,您可以创建一个扩展方法来轻松枚举ArraySegment<T>
:
public static IEnumerable<T> AsEnumerable<T>(this ArraySegment<T> segment)
{
for (int i = 0; i < segment.Count; i++)
{
yield return segment.Array[segment.Offset + i];
}
}
...
ArraySegment<double> segment = ...
foreach (double d in segment.AsEnumerable())
{
...
}
如果您需要按索引访问项目,则需要创建一个实现IList<T>
. 这是一个简单的实现: http: //pastebin.com/cRcpBemQ