我有一个包含ZipArchive
和压缩filename as a String
的压缩文件列表。我还有一个文件名的最终列表,我需要检查我的列表,如果文件与我的最终文件名列表不匹配,则应从我的压缩文件列表中转储它们。
我的立场可能不是最好的措辞,所以让我尝试用我的代码/伪代码解释。
这是我的清单:
List<ZipContents> importList = new List<ZipContents>();
其中有两个参数:
ZipArchive
,名为ZipFile
String
,名为FileName
filenames
是我试图检查ZipContents
列表的文件名的最终列表。
以下是我要做的事情的开始:
foreach (var import in importList)
{
var fn = import.FileName;
// do some kind of lookup to see if fn would be List<String> filenames
// If not in list dump from ZipContents
}
注释掉的部分是我不确定的事情。有人能帮助我走上正轨吗?谢谢!
编辑1
我知道我最初没有这么说,但我认为LINQ将是更清晰的路线。我是多么不积极如何。我假设使用.RemoveAll(..)
将是我想要的方式吗?
答案 0 :(得分:0)
您可以执行以下操作:
if (!filenames.Contains(fn)) {
importList.Remove(import);
}
或者,我相信您可以使用Linq将此逻辑简化为一行。
编辑:
是的,你可以只创建一个你想要的新列表,如下所示:
var newImportList = importList.Where(il => filenames.Contains(il.FileName)).ToList();
答案 1 :(得分:0)
您可以在一行中执行此操作。只需使用LINQ重新建立列表:
var filenames = new List<string> {"file1", "file2"};
var zipcontents = new List<ZipContents>
{
new ZipContents {FileName = "file1"},
new ZipContents {FileName = "file2"},
new ZipContents {FileName = "file3"}
};
zipcontents = zipcontents.Where(z => filenames.Contains(z.FileName)).ToList();
//zipcontents contains only files that were in 'filenames'
老实说,这就是LINQ的用途:查询数据。
答案 2 :(得分:0)
反向循环浏览importList
并删除filenames
中未找到的项目。假设您没有太多项目,表现应该没问题:
for (int i = importList.Count - 1; i >= 0; i--)
{
if (!filenames.Contains(importList[i].FileName))
{
importList.RemoveAt(i);
}
}
您无法使用foreach
从列表中删除项目,因为它会修改集合,但您可以使用我的示例中的构造执行此操作。