C# 拆分然后合并字节[]

C# 拆分然后合并字节[],c#,arrays,bytearray,C#,Arrays,Bytearray,所以我要做的是将一个字节[]保存到我的数据库中。如果发送到数据库的字节太长,我想把它分成两个大小为一半的字节。但是我做错了,因为当我检查splittet字节的组合是否等于原始字节时,它不是 我的代码如下所示: public File Add(File item) { try { if (item == null) { throw new ArgumentNullExce

所以我要做的是将一个字节[]保存到我的数据库中。如果发送到数据库的字节太长,我想把它分成两个大小为一半的字节。但是我做错了,因为当我检查splittet字节的组合是否等于原始字节时,它不是

我的代码如下所示:

    public File Add(File item)
    {
        try
        {
            if (item == null)
            {
                throw new ArgumentNullException("item");
            }

            db.Entry(item).State = EntityState.Added;
            db.SaveChanges();
        }
        catch
        {
            File firstHalf = item;
            File lastHalf = item;
            firstHalf.@byte = item.@byte.Take(item.@byte.Length / 2).ToArray();
            lastHalf.@byte = item.@byte.Skip(item.@byte.Length / 2).ToArray();

            byte[] rv = new byte[firstHalf.@byte.Length + firstHalf.@byte.Length];
            System.Buffer.BlockCopy(firstHalf.@byte, 0, rv, 0, firstHalf.@byte.Length);
            System.Buffer.BlockCopy(lastHalf.@byte, 0, rv, firstHalf.@byte.Length, lastHalf.@byte.Length);

            if(rv == item.@byte)
            {
                Add(firstHalf);
                Add(lastHalf);
            }
        }

        return item;
    }

编辑

public partial class File
{
    public int C_id { get; set; }
    public string name { get; set; }
    public byte[] @byte { get; set; }
    public int file_id { get; set; }
    public int fk_folder { get; set; }
    public int fk_profile { get; set; }
}

要进行比较,请在当前查看它们是否是相等的引用时使用
rv.SequenceEqual(item.@byte)
(或循环)

也不要使用异常来控制流

问题从这里开始:

File firstHalf = item;
File lastHalf = item;
firstHalf.@byte = item.@byte.Take(item.@byte.Length / 2).ToArray();
您只是在第一行中创建了对
项的新引用,所以在第三行中您正在破坏原始
@byte

您需要改为使用
项的深度副本

一种可能的方法-在
文件
类中创建
克隆
方法,该方法将返回带有复制字段的
文件
的新实例,而不是
文件前半部分=项它将是
文件firstHalf=item.Clone()


这是我想到的第一个方法,可能不是最好的。事实上,我现在无法估计-你真的需要两份你的
项目的精确副本吗
-也许这个逻辑应该重构。

什么是
文件
?它是您自己的类还是
System.IO.File
?那些
@byte
成员是什么?这真的是正确的语法吗?(前缀@prefix允许通常保留字作为成员)@thorstenditmar:在C#中的变量前面使用
@
前缀可以使用保留字命名变量。()@AlexK。谢谢你每天都能学到新东西。不过我想换个名字比较容易。无论如何它都应该大写。这只是十几个错误中的第一个:(@BenVoigt,是的,也是最明显的一个。事实上,只有这足以损坏源数据。@BenVoigt:如果你能详细说明,我会很高兴;-)我知道我不是最好的,我想learn@MichaelTotKorsgaard:嗯,紧跟其后的一行不会跳过第一组中的相同数量的项目。然后它扔掉剩下的一半物品。未正确计算
rv
的大小。正如Alex提到的那样,比较是错误的。你会如何设置一种方法来控制它?如果(item==null)
,只需为
设置一个
else
?啊,我明白了。try-catch是用于
SaveChange
if(item==null)
应该在try-catch之前^my bad