LINQ 中常用函数使用: Take TakeWhile Skip SkipWhile Reverse Distinct
1,Take 方法
Take方法用于从一个序列的开头返回指定数量的元素。
string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };
//直接输出前3个元素
Console.WriteLine("Take方法直接输出前3个元素");
foreach (var name in names.Take(3))
{
Console.WriteLine(name);
}
var query = from n in names
where n.Length == 2
select n;
Console.WriteLine("\nTake方法输出查询结果的前1个元素");
foreach (var s in query.Take(1))
{
Console.WriteLine(s);
}
2,TakeWhile 方法
TakeWhile方法获取序列中从开头起符合条件的元素,直到遇到不符合条件的元素为止的所有元素。条件代理部分有两种形
式:
Func<TSource, bool> predicate
Func<TSource, int, bool> predicate 第二个参数是元素的索引
注意:当条件为假时,就停止了,后面的元素不会输出。
string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };
//输出名字小于4个字的元素
var takeNames = names.TakeWhile(n => n.Length < 4);
foreach (var name in takeNames)
{
Console.WriteLine(name);
}
Console.WriteLine("\nTakeWhile 带索引参数");
//输出名字字数小于等于4 并且索引小于4的元素
foreach (var name in names.TakeWhile((n, i) => n.Length <= 4 && i < 4))
{
Console.WriteLine(name);
}
3,Skip 方法
Skip方法用于跳过序列中指定个数的元素
string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };
//跳过前3个元素
Console.WriteLine("Take方法跳过前3个元素");
foreach (var name in names.Skip(3))
{
Console.WriteLine(name);
}
var query = from n in names
where n.Length == 2
select n;
Console.WriteLine("\nTake方法跳过查询结果的前1个元素");
foreach (var s in query.Skip(1))
{
Console.WriteLine(s);
}
4,SkipWhile 方法
SkipWhile 方法用于只要满足指定的条件,就跳过序列中得元素。
注意:当遇到条件为假时,就停止跳越了,输出剩余的所有元素。
string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };
Console.WriteLine("SkipWhile跳过名字为2个字的元素");
foreach (var name in names.SkipWhile(n => n.Length == 2))
{
Console.WriteLine(name);
}
Console.WriteLine("\nSkipWhile跳过名字小于4个字,并且索引小于2");
foreach (var s in names.SkipWhile((n, i) => n.Length < 4 && i < 2))
{
Console.WriteLine(s);
}
5,Reverse 方法
Reverse 方法用于反转序列中的元素。
string[] names = { "郭靖", "李莫愁", "欧阳晓晓", "黄蓉", "黄药师" };
foreach (var name in names.Reverse())
{
Console.WriteLine(name);
}
6,Distinct 方法
Distinct 方法用于去除重复元素。
string[] names = { "郭靖", "郭靖", "李莫愁", "欧阳晓晓", "欧阳晓晓", "黄蓉", "黄药师" };
Console.WriteLine("含有重复元素的数组");
foreach (var name in names)
{
Console.Write(name + " ");
}
Console.WriteLine("\n\n去除重复元素的数组");
foreach (var name in names.Distinct())
{
Console.Write(name + " ");
}
自定义IEqualityComparer<T>接口的相等比较器
public class MyEqualityComparer<T> : IEqualityComparer<T>
{
#region IEqualityComparer<T> 成员
public bool Equals(T x, T y)
{
string temp = x as string;
if (temp != null)
{
if (temp == "欧阳晓晓") //对"欧阳晓晓"不过滤
return false;
}
if (x.GetHashCode() == y.GetHashCode())
return true;
else
return false;
}
public int GetHashCode(T obj)
{
return obj.GetHashCode();
}
#endregion
}
private void DistinctDemo()
{
string[] names = { "郭靖", "郭靖", "李莫愁", "欧阳晓晓", "欧阳晓晓", "黄蓉", "黄药师" };
Console.WriteLine("含有重复元素的数组");
foreach (var name in names)
{
Console.Write(name + " ");
}
Console.WriteLine("\n\n去除重复元素的数组,实现自定义IEqualityComparer<T>");
foreach (var name in names.Distinct(new MyEqualityComparer<string>()))
{
Console.Write(name + " ");
}
}
对某个个例对象排除进行去重
最新文章
- android 之 启动画面的两种方法
- the fourth class
- java-读properties配置文件
- 【转】使用C#实现ADSL自动拨号
- How to: Host and Run a Basic Windows Communication Foundation Service
- MVC中的URL路由(一)
- 20151217--Ajax的一点补充
- codevs 3013 单词背诵 hash
- BZOJ 3314: [Usaco2013 Nov]Crowded Cows( 单调队列 )
- Form表单中method=post/get两种数据传输的方式的区别
- Lintcode208 Assignment Operator Overloading (C++ Only) solution 题解
- 使用生成器把Kafka写入速度提高1000倍
- Bootstrap3 栅格系统-实例:多余的列(column)将另起一行排列
- final和static关键字
- easyui-tree-url-param
- 别人的Linux私房菜(6)文件权限与目录配置
- Async:简洁优雅的异步之道
- 【Cmd】那些年,我们迷恋的cmd命令(一)
- 02_Spark Application不同模式下的监控
- setTimeOut函数和setInterval函数
热门文章
- POJ 2718 Smallest Difference(最小差)
- 4、Ansible(tags、roles)
- 2、Python程序控制结构(0530)
- python学习 day15打卡 初识面向对象
- 【Ruby】【高级编程】面向对象
- 蚂蚁金服首席数据科学家漆远:AI技术开放,与业界融合共创
- P1547 Out of Hay
- linux df
- 设计模式(一)Chain Of Responsibility责任链模式
- [原][spark]帧序列的纹理UV索引,修改spark源码,改变纹理索引方式,支持常规帧序列