在C#中,LINQ提供了几个分区操作符,允许你根据条件或者位置将集合分割成更小的部分。这些操作符包括Take
、Skip
、TakeWhile
和SkipWhile
。使用这些操作符可以帮助你在处理集合时更加灵活。
Skip | 通过指定数量跳过指定的序列中一些的元素,并返回其余的 |
---|---|
SkipWhile | 与Skip相同,唯一的例外跳到多个元素,跳过的是由一个布尔条件指定 |
Take | 通过指定数量取得元素指定的序列,并跳过其余的 |
TakeWhile | 与Take相同,以不同的条件,元素采取的是由一个布尔条件指定 |
以上操作符在c#中都不支持表达式。
一个例子
基础类
C#class Hero
{
public int HeroNo { get; set; }
public string Name { get; set; }
public string Country { get; set; }
public int Age { get; set; }
public Hero(string name, int age, int heroNo, string country)
{
Name = name;
Age = age;
HeroNo = heroNo;
Country = country;
}
}
class Army
{
public int HeroNo { get; set; }
public int ArmyNo { get; set; }
public int Qty { get; set; }
public string TeamLeader { get; set; }
}
Skip
Skip
方法跳过集合中指定数量的元素,并返回剩余的元素。
C#List<Hero> heroes = new List<Hero>
{
new Hero("张飞",38,100,"蜀"),
new Hero("刘备",40,101,"蜀"),
new Hero("关羽",39,102,"蜀"),
new Hero("曹操",45,103,"魏"),
new Hero("孙权",31,104,"吴"),
new Hero("黄忠",45,105,"蜀"),
new Hero("夏侯惇",45,106,"魏")
};
var ret = heroes.Skip(2);//跳过2个元素
foreach (var item in ret)
{
lstAll.Items.Add(item.Name);
}
SkipWhile
SkipWhile
方法跳过序列中从开始计算的满足指定条件的一系列元素,一旦遇到不满足条件的元素,剩余的序列将被返回。
C#private void btnSearch_Click(object sender, EventArgs e)
{
List<Hero> heroes = new List<Hero>
{
new Hero("张飞",38,100,"蜀"),
new Hero("刘备",40,101,"蜀"),
new Hero("关羽",39,102,"蜀"),
new Hero("曹操",45,103,"魏"),
new Hero("孙权",31,104,"吴"),
new Hero("黄忠",45,105,"蜀"),
new Hero("夏侯惇",45,106,"魏")
};
var ret = heroes.SkipWhile((x,y)=>x.Age<46 && y<5);//找到<46最前一个,再跳过5个元素
foreach (var item in ret)
{
lstAll.Items.Add(item.Name);
}
}
Take
Take
方法从集合的开始返回指定数量的元素。
C#private void btnSearch_Click(object sender, EventArgs e)
{
List<Hero> heroes = new List<Hero>
{
new Hero("张飞",38,100,"蜀"),
new Hero("刘备",40,101,"蜀"),
new Hero("关羽",39,102,"蜀"),
new Hero("曹操",45,103,"魏"),
new Hero("孙权",31,104,"吴"),
new Hero("黄忠",45,105,"蜀"),
new Hero("夏侯惇",45,106,"魏")
};
var ret = heroes.Take(2).ToList();
foreach (var item in ret)
{
lstAll.Items.Add(item.Name);
}
}
TakeWhile
TakeWhile
方法根据条件返回序列中从开始到第一个不满足条件的元素为止的所有元素。
C#private void btnSearch_Click(object sender, EventArgs e)
{
List<Hero> heroes = new List<Hero>
{
new Hero("张飞",38,100,"蜀"),
new Hero("刘备",40,101,"蜀"),
new Hero("关羽",39,102,"蜀"),
new Hero("曹操",45,103,"魏"),
new Hero("孙权",31,104,"吴"),
new Hero("黄忠",45,105,"蜀"),
new Hero("夏侯惇",45,106,"魏")
};
var ret = heroes.TakeWhile((x, y) => x.Age < 45 && y<2);//年纪<45且前2条
foreach (var item in ret)
{
lstAll.Items.Add(item.Name);
}
}
Take
和Skip
非常适合用于分页场景,例如从数据库查询结果中获取特定页的数据。TakeWhile
和SkipWhile
适用于更加动态的条件,比如从序列的开始计算,直到遇到某个特定的条件不再满足。本文作者:rick
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!