如何使用条件或基于数组改进 List.Findall()?

How can I improve a List.Findall() with conditionals OR based on an array?

我正在尝试将过滤器改进为一个元素列表,该列表与另一个列表中的任何元素相匹配。

所以,今天的代码列表如下所示:

var list1 = new List<String>();
list1.Add("One");
list1.Add("Two");
list1.Add("One");
list1.Add("Two");
list1.Add("Three");
list1.Add("Four");

var newlist = list1.FindAll(l => l == "One" ||l == "Two" ).ToList();

Console.Writeline(newlist.Count);//This is the result I'm looking for.

新的要求是条件根据需要而变化 所以我将 l == "One" ||l == "Two" 更改为数组并将逻辑编码如下:

我所做的代码更改是基于 我创建了 var cond = "One,Two,Three";

现在代码看起来是:

var cond = "One,Two,Three";

var list2 = new List<String>();
foreach ( String l in cond.Split(','))
{
    list2.AddRange(list1.FindAll(n => n == l).ToList());
}
Console.Writeline(list2.Count);//This is the result I'm looking for.

这行得通,但是 foreach 循环当时每个条件都有。

foreach循环可以改进吗?

谢谢

您可以将 cond 转换为数组,然后检查它是否 Contains() 列表项:

var cond = new[] { "One", "Two", "Three" };
var list2 = list1.FindAll(n => cond.Contains(n));

这将为您提供满足条件的所有项目的列表。如果你只关心计数,你可以使用:

int count = list1.Count(n => cond.Contains(n));
Console.Writeline(count);

如果需要计数,可以使用Count LINQ方法,里面有Contains

var cond = "One,Two,Three";
var conditions = cond.Split(',').ToArray();

var count = list1.Count(w => conditions.Contains(w));

Console.Writeline(count);

我注意到您的设置的另一种方式和一些可以改进的地方。

static void Main(string[] args)
        {
            //Rather than making a string you need to split into an array just start with one.
            string[] targetValues = { "One", "Two" };

            //You don't need to use Upper Case for String when creating a this list
            List<string> queryValues = new List<string>
            {
                "One",
                "Two",
                "One",
                "Two",
                "Three",
                "Four"
            };

            // Comparison done here
            List<string> results = queryValues.Where(x => targetValues.Contains(x)).ToList();

            // Seperating the list for the printout for easier viewing 
            Console.WriteLine(string.Join(", ", results));
        }

InfoStringstring 上发现 here