LINQ之Take, TakeWhile
发布日期:2021-05-07 00:14:36 浏览次数:20 分类:精选文章

本文共 4994 字,大约阅读时间需要 16 分钟。

LINQ Take() 与 TakeWhile() 的功能对比

在 LINQ(Language Integrated Query)中,Take()TakeWhile() 是两个常用的方法,用于从序列中获取指定数量的元素或满足特定条件的元素。本文将详细介绍这两种方法的功能及其区别。

Take() 方法

Take() 是一个简单且强大的方法,用于从序列的开头获取指定数量的元素。它接受一个整数参数 count,表示要取出的元素数量。如果 count 大于序列的长度,取出的元素数量将等于序列的总数;如果 count 为负数,取出的元素数量将为 0。

例如,以下代码示例展示了 Take() 的基本用法:

public static class Program{    static void Main(string[] args)    {        int[] numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };        string[] texts = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };        // 取出前 3 个元素        IEnumerable
takenNumbers = numbers.Take(3); // 取出前 4 个元素 IEnumerable
takenTexts = texts.Take(4); System.Console.WriteLine("takenNumbers:{0}", takenNumbers.Text()); System.Console.WriteLine("takenTexts :{0}", takenTexts.Text()); System.Console.ReadKey(); } public static string Text
(this IEnumerable
i_source) { string text = string.Empty; foreach (var value in i_source) { text += string.Format("[{0}], ", value); } return text; }}

运行上述代码,输出结果如下:

takenNumbers:[0], [1], [2],takenTexts :[Sun], [Mon], [Tue], [Wed],

需要注意的是,如果传递的大于元素总数的数字或负数给 count 参数,Take() 方法也会正常工作。例如,传递 100 作为 count 时,会取出所有元素;传递 -5 时,结果将是空集合。

TakeWhile() 方法

TakeWhile() 方法的功能与 Take() 有所不同,它不仅取出指定数量的元素,还允许您通过提供一个函数来筛选元素,满足特定的条件。具体来说,TakeWhile() 会从序列的开头开始,依次检查每个元素是否满足给定的条件。如果满足条件,则取出该元素;如果不满足,则停止取出过程。

TakeWhile() 的方法定义如下:

public static IEnumerable
TakeWhile
(this IEnumerable
source, Func
predicate)

示例代码

以下代码示例展示了 TakeWhile() 的基本用法:

public static class Program{    static void Main(string[] args)    {        int[] numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };        string[] texts = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };        // 取出小于 4 的值        IEnumerable
takenNumbers = numbers.TakeWhile(value => value < 4); // 取出结尾为 "n" 的字符串 IEnumerable
takenTexts = texts.TakeWhile(value => value.EndsWith("n")); System.Console.WriteLine("takenNumbers:{0}", takenNumbers.Text()); System.Console.WriteLine("takenTexts :{0}", takenTexts.Text()); System.Console.ReadKey(); }}

运行上述代码,输出结果如下:

takenNumbers:[0], [1], [2], [3],takenTexts :[Sun], [Mon],

需要注意的是,TakeWhile() 方法可以接受一个带有两个参数的函数作为筛选条件。例如,Func<TSource, int, bool> 形式的函数可以将元素的值和索引一起传递给筛选条件。这样可以提供更强大的控制能力。

Where() 与 TakeWhile() 的区别

在 LINQ 中,Where() 方法与 TakeWhile() 方法的功能有明显区别。Where() 方法用于获取满足特定条件的所有元素,而不会限制元素的数量。例如,以下代码展示了 Where() 的基本用法:

public static class Program{    static void Main(string[] args)    {        int[] numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };        // 取出小于 5 的值        IEnumerable
whereNumbers = numbers.Where(value => value < 5); System.Console.WriteLine("whereNumbers:{0}", whereNumbers.Text()); System.Console.ReadKey(); }}

输出结果如下:

whereNumbers:[0], [1], [2], [3], [4],

可以看到,Where() 方法会返回所有满足条件的元素,而不仅仅是从开头开始的前若干个元素。

示例对比

为了更直观地比较 TakeWhile()Where() 的区别,可以参考以下代码示例:

public static class Program{    static void Main(string[] args)    {        int[] numbers = new int[] { 0, 3, 6, 1, 4, 5, 8, 7, 2, 9 };        // 取出小于 5 的值        IEnumerable
takenNumbers = numbers.TakeWhile(value => value < 5); // 取出小于 5 的值 IEnumerable
whereNumbers = numbers.Where(value => value < 5); System.Console.WriteLine("takenNumbers:{0}", takenNumbers.Text()); System.Console.WriteLine("whereNumbers:{0}", whereNumbers.Text()); System.Console.ReadKey(); }}

输出结果如下:

takenNumbers:[0], [3],whereNumbers:[0], [3], [1], [4], [2],

可以看到,TakeWhile() 方法的输出结果与 Where() 方法的输出结果并不完全相同,因为 TakeWhile() 会在遇到不满足条件的元素时立即停止取出过程。

TakeWhile() 的高级功能

除了基本的筛选功能,TakeWhile() 还可以接受一个带有两个参数的函数作为筛选条件。例如,Func<TSource, int, bool> 形式的函数可以将元素的值和索引一起传递给筛选条件。这样可以提供更强大的控制能力。

例如,以下代码展示了 TakeWhile() 的高级用法:

public static class Program{    static void Main(string[] args)    {        int[] numbers = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };        string[] texts = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };        // 取出值大于索引的元素        IEnumerable
takenNumbers = numbers.TakeWhile((value, index) => value > index); // 取出长度大于索引的字符串 IEnumerable
takenTexts = texts.TakeWhile((value, index) => value.Length > index); System.Console.WriteLine("takenNumbers:{0}", takenNumbers.Text()); System.Console.WriteLine("takenTexts :{0}", takenTexts.Text()); System.Console.ReadKey(); }}

输出结果如下:

takenNumbers:[9], [8], [7], [6], [5],takenTexts :[Sun], [Mon], [Tue], [Wed], [Thu], [Fri],

通过这种方式,可以对元素的值和索引进行联合判断,进一步提高取出元素的灵活性。

总结

Take() 方法用于从序列的开头获取指定数量的元素,而 TakeWhile() 方法则用于从序列的开头开始,依次检查每个元素是否满足给定的条件。如果满足条件,则取出该元素;如果不满足,则停止取出过程。Where() 方法则用于获取满足特定条件的所有元素,但不会限制元素的数量。因此,在实际应用中,选择使用 TakeWhile() 还是 Where() 取决于您的需求。如果需要从序列的开头开始,并根据条件取出元素,则 TakeWhile() 是更合适的选择。

上一篇:LINQ之DefaultIfEmpty
下一篇:LINQ之Skip,SkipWhile

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月25日 05时17分30秒