我正在尝试将过滤器改进为与另一个列表的任何元素匹配的元素列表。
所以,今天,代码列表如下所示:
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 循环与 Go 在当时每个条件。
foreach 循环可以改进吗?
谢谢
另一种方式和我注意到您的设置可以改进的几件事。
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));
}
有关字符串与字符串的信息,可在此处找到
您可以将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);