Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从for each循环内部移除回调_C# - Fatal编程技术网

C# 从for each循环内部移除回调

C# 从for each循环内部移除回调,c#,C#,以下是大部分代码: foreach (var file in dialog.Files.Where(someConditionsGoHere).AsEnumerable()) { Images imageRec = this.CreateNew<Images>(); imageRec.Description = file.Name; imageRec.AsOfDate = System.DateTime.Now; // inits some more

以下是大部分代码:

foreach (var file in dialog.Files.Where(someConditionsGoHere).AsEnumerable())
{
    Images imageRec = this.CreateNew<Images>();
    imageRec.Description = file.Name;
    imageRec.AsOfDate = System.DateTime.Now;
    // inits some more fields here 

    using (System.IO.Stream fileStream = file.OpenRead())
    {
        byte[] fileBytes = new byte[System.Convert.ToInt32(fileStream.Length)];
        fileStream.Read(fileBytes, 0, fileBytes.Length);

        if (imageRec.Extension.ToUpper() == "TIFF" || imageRec.Extension.ToUpper() == "TIF")
        {
            // pop a yes/no dialog to convert to PDF.
            Action<UI.Interactivity.InteractionRequest.YesNoDialog.YesNoDialogConfirmation> callback = c =>
                {
                    if (c.Yes)
                    {
                        foreach (var tiffFile in dialog.Files)
                        {
                            string ext = tiffFile.Extension.Substring(1);
                            if (ext.ToUpper() != "TIF" && ext.ToUpper() != "TIFF") continue;

                            using (System.IO.Stream tiffFileStream = tiffFile.OpenRead())
                            {
                                byte[] tiffFileBytes =
                                    new byte[System.Convert.ToInt32(tiffFileStream.Length)];
                                tiffFileStream.Read(tiffFileBytes, 0, tiffFileBytes.Length);

                                Images imageRec2 = this.CreateNew<Images>();
                                imageRec2.Description = tiffFile.Name;
                                imageRec2.Extension = "pdf";
                                // some more inits and sutff here too.
                                ImagingUtilities.ConvertImgToPDF(tiffFileBytes, imageRec2)
                            }
                        }
                    }
                    else
                    {
                        this.SaveAndAddImage(imageRec, fileBytes, file.Name);
                    }
                };

            this.OpenYesNoDialog("Do you want to convert Tiff files to PDF before saving them?", callback);

        }
        else
        {
            this.SaveAndAddImage(imageRec, fileBytes, file.Name);
        }
    }
}
foreach(dialog.Files.Where(someConditionsGoHere.AsEnumerable()中的var文件)
{
Images imageRec=this.CreateNew();
imageRec.Description=文件名;
imageRec.AsOfDate=System.DateTime.Now;
//这里还有一些字段
使用(System.IO.Stream fileStream=file.OpenRead())
{
byte[]fileBytes=新字节[System.Convert.ToInt32(fileStream.Length)];
读取(fileBytes,0,fileBytes.Length);
if(imageRec.Extension.ToUpper()=“TIFF”| | imageRec.Extension.ToUpper()=“TIF”)
{
//弹出“是/否”对话框以转换为PDF。
动作回调=c=>
{
如果(c.是)
{
foreach(dialog.Files中的文件)
{
字符串ext=tiffile.Extension.Substring(1);
如果(ext.ToUpper()!=“TIF”和&ext.ToUpper()!=“TIFF”)继续;
使用(System.IO.Stream tiffFileStream=tiffFile.OpenRead())
{
字节[]文件字节=
新字节[System.Convert.ToInt32(tiffFileStream.Length)];
读取(tiffFileBytes,0,tiffFileBytes.Length);
Images imageRec2=this.CreateNew();
imageRec2.Description=tiffile.Name;
imageRec2.Extension=“pdf”;
//这里还有一些inits和sutf。
ImageGutilities.ConvertImgToPDF(tiffFileBytes,imageRec2)
}
}
}
其他的
{
this.SaveAndAddImage(imageRec、fileBytes、file.Name);
}
};
此.OpenYesNoDialog(“是否要在保存Tiff文件之前将其转换为PDF?”,回调);
}
其他的
{
this.SaveAndAddImage(imageRec、fileBytes、file.Name);
}
}
}
当前,它在循环浏览中的图像时显示
YesNo对话框
,如果该图像是
“.tiff”
文件,它将通过
YesNo
对话框转到
回调
方法,询问用户是否希望将其转换为
PDF

问题是,我不想让它为每个
tiff
文件询问用户,我只想让它询问一次,因此我应该从
for each循环中取出
回调
,但当我这样做时,由于回调的
async
属性,我丢失了调用命令的顺序。有人能帮忙重组吗

看起来您有一个最外层的循环,它在
dialog.Files
上迭代,然后在回调内部有另一个循环,它在
dialog.Files
上迭代。这是一个太多层次的迭代

我想你可以通过把它分解成几个方法来解决这个问题。编写一个方法
ProcessFile
,该方法接受一个
File
对象和一个bool,表示是否需要将其转换为PDF(或在回调中执行的任何不同操作),并相应地对其进行处理

现在,您可以将粘贴在此处的所有代码替换为以下代码:

this.OpenYesNoDialog("...", ans => {
    foreach(var file in dialog.Files.Where(someConditionsGoHere))
        ProcessFile(file, ans.Yes)
});
基于我对代码的有限理解,我认为
ProcessFile
应该是这样的:

private void ProcessFile(File file, bool convertToPDF) 
{
    Images imageRec = this.CreateNew<Images>();

    imageRec.Description = file.Name;
    imageRec.AsOfDate = System.DateTime.Now;
    // ...

    using (System.IO.Stream fileStream = file.OpenRead()) {
        byte[] fileBytes = new byte[System.Convert.ToInt32(fileStream.Length)];
        fileStream.Read(fileBytes, 0, fileBytes.Length);

        if (convertToPDF && (ext.ToUpper() == "TIF" || ext.ToUpper() == "TIFF")) 
        {
            // Configure imageRec fields for PDF
            imageRec.Extension = "pdf";
            // ...

            ImagingUtilities.ConvertImgToPDF(tiffFileBytes, imageRec);
        }
        else
        {
            // Configure imageRec fields for everything else
            // ...

            this.SaveAndAddImage(imageRec, fileBytes, file.Name);
        }


    }
}
private void进程文件(文件文件文件,bool convertToPDF)
{
Images imageRec=this.CreateNew();
imageRec.Description=文件名;
imageRec.AsOfDate=System.DateTime.Now;
// ...
使用(System.IO.Stream fileStream=file.OpenRead()){
byte[]fileBytes=新字节[System.Convert.ToInt32(fileStream.Length)];
读取(fileBytes,0,fileBytes.Length);
如果(convertToPDF&(ext.ToUpper()=“TIF”| | ext.ToUpper()=“TIFF”))
{
//为PDF配置imageRec字段
imageRec.Extension=“pdf”;
// ...
ConvertImgToPDF(tiffilebytes,imageRec);
}
其他的
{
//为其他所有内容配置imageRec字段
// ...
this.SaveAndAddImage(imageRec、fileBytes、file.Name);
}
}
}

对于您粘贴的内容来说,这是一种粗糙和坚韧的方式。您需要对pdf ConvertImgToPDF调用进行一些更改以返回字节数组。这将删除双循环,并仅提示TIFF一次

   var askedToConvert = false;
   var convertTiff = false;
   foreach (var file in dialog.Files.Where(someConditionsGoHere).AsEnumerable())
    {
        Images imageRec = this.CreateNew<Images>();
        imageRec.Description = file.Name;
        imageRec.AsOfDate = System.DateTime.Now;
        // inits some more fields here 


        using (System.IO.Stream fileStream = file.OpenRead())
        {
            byte[] fileBytes = new byte[System.Convert.ToInt32(fileStream.Length)];
            fileStream.Read(fileBytes, 0, fileBytes.Length);

            if (imageRec.Extension.ToUpper() == "TIFF" || imageRec.Extension.ToUpper() == "TIF")
            {

                 if(!askedToConvert) 
                 {          
                     this.OpenYesNoDialog("Do you want to convert Tiff files to PDF before saving them?", c=>  {
                       askedToConvert = true;
                       convertTiff = c.Yes;
                     });
                 }
                 if(convertTiff) 
                 {          

                     imageRec.Extension = "pdf";
                     // some more inits and sutff here too.             
                     fileBytes = ImagingUtilities.ConvertImgToPDF(fileBytes) ; // this needs to return new bytes    

              } 

              this.SaveAndAddImage(imageRec, fileBytes, file.Name);

        }
    }
var askedToConvert=false;
var-convertTiff=假;
foreach(dialog.Files.Where(someConditionsGoHere.AsEnumerable()中的var文件)
{
Images imageRec=this.CreateNew();
imageRec.Description=文件名;
imageRec.AsOfDate=System.DateTime.Now;
//这里还有一些字段
使用(System.IO.Stream fileStream=file.OpenRead())
{
byte[]fileBytes=新字节[System.Convert.ToInt32(fileStream.Length)];
读取(fileBytes,0,fileBytes.Length);
if(imageRec.Extension.ToUpper()=“TIFF”| | imageRec.Extension.ToUpper()=“TIF”)
{
如果(!askedToConvert)
{          
此.OpenYesNoDialog(“是否要在保存Tiff文件之前将其转换为PDF?”,c=>{
askedToConvert=true;
convertTiff=c。是;
});
}
如果(TIFF)
{          
imageRec.Extension=“pdf”;
//这里还有一些inits和sutf。
fileBytes=ImagingUtilities.ConvertImgToPDF(fileBytes);//这需要返回新字节
//any additional logic like filtering for if we have a tiff etc here.

    Action<UI.Interactivity.InteractionRequest.YesNoDialog.YesNoDialogConfirmation> callback = c =>
            {
                if (c.Yes)
                {
                    foreach (var tiffFile in dialog.Files.Where(x=>x.Extension.ToUpper() == "TIFF" || x.Extension.ToUpper() == "TIF"))
                    {


                        using (System.IO.Stream tiffFileStream = tiffFile.OpenRead())
                        {
                            byte[] tiffFileBytes =
                                new byte[System.Convert.ToInt32(tiffFileStream.Length)];
                            tiffFileStream.Read(tiffFileBytes, 0, tiffFileBytes.Length);

                            Images imageRec2 = this.CreateNew<Images>();
                            imageRec2.Description = tiffFile.Name;
                            imageRec2.Extension = "pdf";
                            // some more inits and sutff here too.
                            ImagingUtilities.ConvertImgToPDF(tiffFileBytes, imageRec2)
                        }
                    }
                }
                else
                {
                    this.SaveAndAddImage(imageRec, fileBytes, file.Name);
                }
            };

        this.OpenYesNoDialog("Do you want to convert Tiff files to PDF before saving them?", callback);


    //tiff already handled
    foreach (var file in dialog.Files.Where(x=>x.Conditions&& !x.Extension.ToUpper() == "TIFF" && !x.Extension.ToUpper() == "TIF").AsEnumerable())
    {
        Images imageRec = this.CreateNew<Images>();
        imageRec.Description = file.Name;
        imageRec.AsOfDate = System.DateTime.Now;
        // inits some more fields here 

        using (System.IO.Stream fileStream = file.OpenRead())
        {
            byte[] fileBytes = new byte[System.Convert.ToInt32(fileStream.Length)];
            fileStream.Read(fileBytes, 0, fileBytes.Length);


            this.SaveAndAddImage(imageRec, fileBytes, file.Name);

        }

    }