返回根据C#中的其他列表过滤的列表

时间:2016-06-03 07:20:27

标签: c# linq

我是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())));
        }
    }

我怎么能让这项工作好吗?最终,我希望能够根据文件扩展名或部分名称从目录列表中过滤文件名。

欢呼声

1 个答案:

答案 0 :(得分:10)

问题在于您使用Any使用了否定条件 - 这意味着如果 不是的任何字词,您将会包含该值#39; t 包含在候选人中。相反,你想把它想象成:

  • 排除文件,如果文件中包含 中的任何单词
  • 如果 所有 ,则包含文件。
  • 包含文件,如果&#34;不是任何&#34;其中的单词(即如果对任何单词的肯定检查都不正确)

所以你可以使用:

return myfiles.Where(file => filterbythesewords.All(item => !file.Contains(item));

return myfiles.Where(file => !filterbythesewords.Any(item => file.Contains(item));

(此处不需要查询表达式 - 当您基本上只是做一个简单的过滤器时,查询表达式不会有助于提高可读性。)