编辑
2025-02-04
C# 应用
00
请注意,本文编写于 91 天前,最后修改于 91 天前,其中某些信息可能已经过时。

目录

摘要
正文
去重(Distinct)
除外(Except)
相交(Intersect)
联合(Union)
使用注意点:

摘要

在C#中,LINQ (Language Integrated Query) 提供了丰富的方法来处理集合数据,包括去重、除外、相交和联合等操作。

正文

操作描述
去重结果:从集合唯一值的列表通过过滤重复的数据,如果有任何结果
除外比较了两个集合的值,并返回从一个集合不在另外一个集合
相交返回集合在两个不同的集合相同的相同部分
联合联合了两种不同内容的集合到一个列表太没有任何重复的内容

去重(Distinct)

Distinct方法用于移除集合中的重复元素,只保留唯一的元素。

C#
class HeroCompare : IEqualityComparer<Hero> { public bool Equals(Hero? x, Hero? y) { return x.Country.Equals(y.Country); } public int GetHashCode([DisallowNull] Hero obj) { string s = obj.Country; return s.GetHashCode(); } } 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; } }
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.Distinct(new HeroCompare()).ToList(); foreach (var item in ret) { lstAll.Items.Add(item.Country); } }

image.png

除外(Except)

Except方法用于获取两个集合的差集,即获取第一个集合中不在第二个集合中的元素。

C#
class HeroCompare : IEqualityComparer<Hero> { public bool Equals(Hero? x, Hero? y) { return x.Name.Equals(y.Name); } public int GetHashCode([DisallowNull] Hero obj) { string s = obj.Name; return s.GetHashCode(); } }
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,"魏") }; List<Hero> heroes1 = new List<Hero> { new Hero("刘封",23,100,"蜀"), new Hero("关平",19,101,"蜀"), new Hero("关羽",39,102,"蜀"), }; var ret = heroes.Except(heroes1,new HeroCompare()); foreach (var item in ret) { lstAll.Items.Add(item.Name); } }

image.png

相交(Intersect)

Intersect方法用于获取两个集合的交集,即获取同时存在于两个集合中的元素。

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,"魏") }; List<Hero> heroes1 = new List<Hero> { new Hero("刘封",23,100,"蜀"), new Hero("关平",19,101,"蜀"), new Hero("关羽",39,102,"蜀"), }; var ret = heroes.Intersect(heroes1,new HeroCompare()); foreach (var item in ret) { lstAll.Items.Add(item.Name); } }

联合(Union)

Union方法用于获取两个集合的并集,即合并两个集合的元素并移除重复的元素。

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,"魏") }; List<Hero> heroes1 = new List<Hero> { new Hero("刘封",23,100,"蜀"), new Hero("关平",19,101,"蜀"), new Hero("关羽",39,102,"蜀"), }; var ret = heroes.Union(heroes1,new HeroCompare()); foreach (var item in ret) { lstAll.Items.Add(item.Name); } }

image.png

使用注意点:

  • 性能:在使用这些操作时,应考虑对性能的影响,特别是在处理大型集合时。
  • 自定义类型:对于自定义类型的集合,可能需要提供比较器或实现IEquatable<T>接口,以确保方法如Distinct能够正确识别重复项。
  • 查询延迟执行:LINQ查询通常采用延迟执行(Deferred Execution),意味着查询表达式在迭代结果之前不会被执行。这允许进一步的查询优化,但也意味着每次迭代结果时查询都会重新执行。

通过合理利用LINQ提供的这些方法,可以有效地处理和操作集合数据,使代码更加简洁和高效。

本文作者:rick

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!