获取不包含其他列表中某些内容的文件列表

时间:2014-01-04 18:56:22

标签: c# linq

尝试将所有以.XML结尾的文件放在不包含关键字的目录中。因此路径可能类似于" C:\ mypath \ string1-filename.xml"并且它不应该在列表中,因为它包含关键字。

这就是我所拥有的:

var files = Directory.GetFiles( "C:\\mypath", "*.xml" )
                .Where( f => !f.Contains( "string1" ) && !f.Contains( "string2" ) && !f.Contains( "string3" ) )
                .ToList();

我想把它改成一点清洁;类似的东西:

var exclusionList = new List<string> { "string1", "string2", "string3"  };
var files = Directory.GetFiles( "C:\\mypath", "*.xml" )
                .Where( f => !f.Contains(exclusionList) )
                .ToList();

谢谢!

3 个答案:

答案 0 :(得分:2)

var exclusionList = new List<string> { "string1", "string2", "string3" };

        var files = Directory.GetFiles("C:\\mypath", "*.xml")
                        .Where(f => !exclusionList.Any(s => f.Contains(s)))
                        .ToList();

答案 1 :(得分:1)

您没有阅读文件内容。请尝试以下代码段。  的更新 我误解了这个问题。我已经更新了答案

 var exclusionList = new List<string> { "string1", "string2", "string3"  };
    var files = Directory.GetFiles( "C:\\mypath", "*.xml" )
                    .Where(f => !exclusionList.Any(s => f.Contains(s)))
                    .ToList();

答案 2 :(得分:1)

没有直接执行此操作的扩展方法。所以这个扩展方法可以帮助您:

public static class MyExtensions
{
    public static bool ContainsAny(this string source, ICollection<string> words)
    {
        foreach (var word in words)
        {
            if (source.Contains(word)) return true;
        }

        return false;
    }
}

像这样使用:

var exclusionList = new List<string> { "string1", "string2", "string3"  };
 var files = Directory.GetFiles( "C:\\mypath", "*.xml" )
                      .Where( f => !f.ContainsAny(exclusionList) )
                      .ToList();