我是C#的新手,所以试图测试一个简单的字符串过滤器,但没有得到所需的结果。这是我的测试方法:
[TestMethod]
public void Test_ExceptFilter()
{
IEnumerable<string> allnames = new List<string>(){"Thumbs.db","~","one","two exe here","three"};
var u = FileLister.GetFilteredList(allnames, new [] { "thumbs","~"}, false);
}
我有一个名为 FileLister 的静态类,它具有 GetFilteredList 方法,并且当我尝试返回一个不包含任何内容的列表时,该位不起作用第二个IEnumerable中的字符串。
所以在我的例子中,我希望你能拥有&#34;一个&#34;,&#34;这里有两个exe&#34;和&#34;三&#34;只有,但它包含了所有名单中的所有项目!。
这些是我尝试过的各种方式,在所有这些方法中,我努力的部分是布尔包含词作为false传递的地方:
//Return strings that contain or dont contain any element in the array
public static IEnumerable<string> GetFilteredList(IEnumerable<string> myfiles,
IEnumerable<string> filterbythesewords, bool includewords)
{
if (includewords)
{
return from line in myfiles
where filterbythesewords.Any(item => line.Contains(item))
select line;
}
else
{
return from line in myfiles
where filterbythesewords.Any(item => !line.Contains(item))
select line;
}
}
第二次审判
//Return strings that contain or dont contain any element in the array
public static IEnumerable<string> GetFilteredList(IEnumerable<string> myfiles,
IEnumerable<string> filterbythesewords, bool includewords)
{
if (includewords)
{
return from line in myfiles
where filterbythesewords.Any(item => line.Contains(item))
select line;
}
else
{
List<string> p = new List<string>();
p.AddRange(myfiles.Except(filterbythesewords));
return p;
}
}
第三次试用
//Return strings that contain or dont contain any element in the array
public static IEnumerable<string> GetFilteredList(IEnumerable<string> myfiles,
IEnumerable<string> filterbythesewords, bool includewords)
{
if (includewords)
{
return from line in myfiles
where filterbythesewords.Any(item => line.Contains(item))
select line;
}
else
{
return myfiles.Where(file => filterbythesewords.Any(x => !file.ToUpperInvariant().Contains(x.ToUpperInvariant())));
}
}
我怎么能让这项工作好吗?最终,我希望能够根据文件扩展名或部分名称从目录列表中过滤文件名。
欢呼声
答案 0 :(得分:10)
问题在于您使用Any
使用了否定条件 - 这意味着如果 不是的任何字词,您将会包含该值#39; t 包含在候选人中。相反,你想把它想象成:
所以你可以使用:
return myfiles.Where(file => filterbythesewords.All(item => !file.Contains(item));
或
return myfiles.Where(file => !filterbythesewords.Any(item => file.Contains(item));
(此处不需要查询表达式 - 当您基本上只是做一个简单的过滤器时,查询表达式不会有助于提高可读性。)