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);
}
}