在C#中,LINQ (Language Integrated Query) 提供了丰富的方法来处理集合数据,包括去重、除外、相交和联合等操作。
操作 | 描述 |
---|---|
去重 | 结果:从集合唯一值的列表通过过滤重复的数据,如果有任何结果 |
除外 | 比较了两个集合的值,并返回从一个集合不在另外一个集合 |
相交 | 返回集合在两个不同的集合相同的相同部分 |
联合 | 联合了两种不同内容的集合到一个列表太没有任何重复的内容 |
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);
}
}
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);
}
}
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
方法用于获取两个集合的并集,即合并两个集合的元素并移除重复的元素。
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);
}
}
IEquatable<T>
接口,以确保方法如Distinct
能够正确识别重复项。通过合理利用LINQ提供的这些方法,可以有效地处理和操作集合数据,使代码更加简洁和高效。
本文作者:rick
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!