我正在尝试将double []浅层复制到段中,并将这些段传递给新线程,如下所示:
for (int i = 0; i < threadsArray.Length; i++)
{
sub[i] = new double[4];
//Doesn't shallow copy since double is a value type
Array.Copy(full, i * 4, sub[i], 0, 4);
double[] tempSub = sub[i];
threadsArray[i] = new Thread(() => DoStuff(tempSub));
threadsArray[i].Start();
}
让创建的段引用原始数组的最佳方法是什么?
最佳答案 您可以使用
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