
本文共 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 个元素 IEnumerabletakenTexts = 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 IEnumerableTakeWhile (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" 的字符串 IEnumerabletakenTexts = 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); // 取出长度大于索引的字符串 IEnumerabletakenTexts = 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()
是更合适的选择。
发表评论
最新留言
关于作者
