去重和排序是开发过程中经常碰到的问题,这篇文章就来总结一下。
去重方法1:使用内置的distinct
代码如下:
//方法1:使用默认的distinct方法//只能针对基元类型列表,对于自定义类型组合字段条件需要自定义相等比较器实现iequalitycomparer接口,比较麻烦var result1 = list.distinct().tolist();
方法2:使用groupby
代码如下:
//方法2:使用groupbyvar result2 = list.groupby(p => new { p.bunkcode, p.bunkprice })
.select(p => p.first())
.tolist();
方法3:使用自己扩展的distinctby方法
代码如下:
//方法3:使用自己扩展的distinctby方法//利用hashset的key不能重复的特性var result3 = list.distinctby(p => new { p.bunkcode, p.bunkprice })
.tolist();
完整代码请参考:
/// <summary>/// 测试类型/// </summary>public class testdistinctclass
{public int id { get; set; }public string bunkcode { get; set; }public double bunkprice { get; set; }
}/// <summary>/// 测试去重/// </summary>private static void testdistinct()
{//数据源var list = new list<testdistinctclass>
{new testdistinctclass
{
id= 1,
bunkcode= a,
bunkprice= 101},new testdistinctclass
{
id= 2,
bunkcode= b,
bunkprice= 102},new testdistinctclass
{
id= 3,
bunkcode= c,
bunkprice= 103},new testdistinctclass
{
id= 4,
bunkcode= d,
bunkprice= 104},new testdistinctclass
{
id= 5,
bunkcode= a,
bunkprice= 101}
};//方法1:使用默认的distinct方法//只能针对基元类型列表,对于自定义类型组合字段条件需要自定义相等比较器实现iequalitycomparer接口,比较麻烦var result1 = list.distinct().tolist();//方法2:使用groupbyvar result2 = list.groupby(p => new { p.bunkcode, p.bunkprice })
.select(p => p.first())
.tolist();//方法3:使用自己扩展的distinctby方法//利用hashset的key不能重复的特性var result3 = list.distinctby(p => new { p.bunkcode, p.bunkprice })
.tolist();
}
同时,我把扩展方法也贴出来:
/// <summary>/// 扩展distinct/// </summary>/// <typeparam name="tsource"></typeparam>/// <typeparam name="tkey"></typeparam>/// <param name="source"></param>/// <param name="keyselector"></param>/// <returns></returns>public static ienumerable<tsource> distinctby<tsource, tkey>(this ienumerable<tsource> source, func<tsource, tkey> keyselector)
{
hashset<tkey> seenkeys = new hashset<tkey>();foreach (tsource element in source)
{if (seenkeys.add(keyselector(element)))
{yield return element;
}
}
}
排序至于排序,使用linq提供的api就好了,如下图:
以上就是去重和排序如何操作的详细内容。