如何在c#上划分数组?

时间:2015-04-12 18:32:56

标签: c# arrays multiprocessing

我必须做一个读取和成像的程序并将其放入一个字节数组

var Imagenoriginal = File.ReadAllBytes("10M.bmp");

并将该字节数组分成3个不同的数组,以便将这些新数组中的每一个发送到其他计算机(使用管道)在那里处理它们,最后将它们带回原始计算机,最后给出结果。 但我的问题是,如果所选图像的大小不同,我该怎么做一个能够将字节数组分成三个不同字节数组的算法。 感谢您的帮助,祝您度过愉快的一天。 =)

3 个答案:

答案 0 :(得分:2)

您可以划分数组的长度,因此您有三个整数n1n2n3,所有这些整数总计为array.Length。然后,使用LINQ的这个片段应该有所帮助:

var arr1 = sourceArray.Take(n1).ToArray();
var arr2 = sourceArray.Skip(n1).Take(n2).ToArray();
var arr3 = sourceArray.Skip(n1+n2).Take(n3).ToArray();

现在,在arr1arr2arr3中,您将拥有源数组的三个部分。您需要使用LINQ,因此在代码的开头不要忘记using System.Linq;

答案 1 :(得分:1)

您可以尝试这样:

public static IEnumerable<IEnumerable<T>> DivideArray<T>(this T[] array, int size)
{
    for (var i = 0; i < (float)array.Length / size; i++)
    {
        yield return array.Skip(i * size).Take(size);
    }
}

这样的电话:

var arr = new byte[] {1, 2, 3, 4, 5,6};
var dividedArray = arr.DivideArray(3);

这是LINQ方法:

public List<List<byte>> DivideArray(List<byte> arr)
{
    return arr
             .Select((x, i) => new { Index = i, Value = x })
             .GroupBy(x => x.Index / 100)
             .Select(x => x.Select(v => v.Value).ToList())
             .ToList();
}

答案 2 :(得分:0)

您是否考虑过使用Streams?您可以扩展Stream类以提供所需的行为,如下所示:

public static class Utilities
{
    public static IEnumerable<byte[]> ReadBytes(this Stream input, long bufferSize)
    {
        byte[] buffer = new byte[bufferSize];
        int read;

        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            using (MemoryStream tempStream = new MemoryStream())
            {
                tempStream.Write(buffer, 0, read);
                yield return tempStream.ToArray();
            }            
        }
    }

    public static IEnumerable<byte[]> ReadBlocks(this Stream input, int nblocks)
    {
        long bufferSize = (long)Math.Ceiling((double)input.Length / nblocks);
        return input.ReadBytes(bufferSize);
    }
}
  • ReadBytes扩展方法读取input Stream并使用指定的bufferSize将其数据作为字节数组序列返回。

  • ReadBlocks扩展方法使用适当的缓冲区大小调用ReadBytes,以便序列中的元素数等于nblocks

然后,您可以使用ReadBlocks来实现您的目标:

public class Program
{
    static void Main()
    {
        FileStream inputStream = File.Open(@"E:\10M.bmp", FileMode.Open);
        const int nblocks = 3;

        foreach (byte[] block in inputStream.ReadBlocks(nblocks))
        {
            Console.WriteLine("{0} bytes", block.Length);
        }
    }
}

注意ReadBytes如何使用tempStreamread在内存中写入从输入流读取的字节,然后再将它们转换为字节数组,它解决了评论中提到的剩余字节的问题。