如何使用条件或基于数组改进 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));
}
Info 在 String 与 string 上发现 here
我正在尝试将过滤器改进为一个元素列表,该列表与另一个列表中的任何元素相匹配。
所以,今天的代码列表如下所示:
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));
}
Info 在 String 与 string 上发现 here