在变量名数组中找到if filename

时间:2014-12-01 18:42:45

标签: c# linq

我有一个包含ZipArchive和压缩filename as a String的压缩文件列表。我还有一个文件名的最终列表,我需要检查我的列表,如果文件与我的最终文件名列表不匹配,则应从我的压缩文件列表中转储它们。

我的立场可能不是最好的措辞,所以让我尝试用我的代码/伪代码解释。

这是我的清单:

List<ZipContents> importList = new List<ZipContents>();

其中有两个参数:

  1. ZipArchive,名为ZipFile
  2. String,名为FileName
  3. 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(..)将是我想要的方式吗?

3 个答案:

答案 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从列表中删除项目,因为它会修改集合,但您可以使用我的示例中的构造执行此操作。