在本文中,我们展示了如何使用LINQ的Where方法和where子句在C#中过滤序列。
语言集成查询(LINQ)是一种特定领域的语言,用于从各种数据源(包括数组、列表、XML文件或数据库)查询数据。
where
子句或Where
方法根据谓词过滤值序列。谓词是一个返回布尔值的单参数函数。
此方法是惰性求值的。在枚举对象之前不执行查询。
C#LINQWhere简单示例
第一个示例是一个使用LINQSelect的简单程序。
var vals = new List<int> { -3, -1, 0, 3, 2, 1, -6, 5, 9 }; var res = vals.Where(e => e > 0); Console.WriteLine(string.Join(',', res));
程序定义了一个整数列表。我们过滤掉所有正值。
var res = vals.Where(e => e > 0);
Where
方法将给定的谓词函数应用于每个元素。它返回满足给定条件的一系列值。在我们的例子中,条件是值大于零。
$ dotnet run 3,2,1,5,9
C#LINQWherewithFunc谓词
Func
是一个内置的通用委托类型。它可以与方法、匿名方法或lambda表达式一起使用。
Func<int, bool> isNeg = (e) => e < 0; var vals = new List<int> { -3, -1, 0, 3, 2, 1, -6, 5, 9 }; var res = vals.Where(isNeg); Console.WriteLine(string.Join(',', res));
程序将Func
委托应用于列表的元素。我们过滤所有负值。
$ dotnet run -3,-1,-6
C#LINQwhere子句
查询表达式是另一种LINQ语法。在查询表达式中,我们使用where
子句来过滤数据。
var words = new List<string> { "sky", "forest", "war", "buy", "crypto", "cup", "water", "cloud" }; var res = from word in words where word.StartsWith("c") select word; Console.WriteLine(string.Join(',', res));
在程序中,我们过滤掉所有以字母“c”开头的单词。
$ dotnet run crypto,cup,cloud
C#LINQWhere有多个条件
我们可以将多个条件与和/或运算符结合起来。
var users = new List<User> { new ("John", "Doe", 1230), new ("Lucy", "Novak", 670), new ("Ben", "Walter", 2050), new ("Robin", "Brown", 2300), new ("Amy", "Doe", 1250), new ("Joe", "Draker", 1190), new ("Janet", "Doe", 980), new ("Albert", "Novak", 1930), }; var res = users.Where(u => (u.LastName.StartsWith("D") || u.LastName.StartsWith("W")) && u.Salary > 1000); foreach (var e in res) { Console.WriteLine(e); } record User(string FirstName, string LastName, int Salary);
在示例中,我们对过滤应用了三个条件。我们只选择名字以“D”或“W”开头且薪水高于1000的用户。
$ dotnet run User { FirstName = John, LastName = Doe, Salary = 1230 } User { FirstName = Ben, LastName = Walter, Salary = 2050 } User { FirstName = Amy, LastName = Doe, Salary = 1250 } User { FirstName = Joe, LastName = Draker, Salary = 1190 }
在本文中,我们介绍了LINQWhere操作。
列出所有C#教程。