zoukankan      html  css  js  c++  java
  • 常用的去重和排序

    去重和排序是开发过程中经常碰到的问题,这篇文章就来总结一下。

    去重

    方法1:使用内置的distinct

    代码如下:

    //方法1:使用默认的distinct方法
    //只能针对基元类型列表,对于自定义类型组合字段条件需要自定义相等比较器实现IEqualityComparer接口,比较麻烦
    var result1 = list.Distinct().ToList();

    方法2:使用GroupBy

    代码如下:

    //方法2:使用GroupBy
    var 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:使用GroupBy
        var 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就好了,如下图:

    2017-06-02_153425

  • 相关阅读:
    HDU.2087 剪花布条
    一个acm过来人的心得
    一个acm过来人的心得
    HDU.2190 悼念512汶川大地震遇难同胞——重建希望小学
    HDOJ.2501 Tiling_easy version
    HDOJ.2501 Tiling_easy version
    HDU
    poj3216 Prime Path(BFS)
    poj1426 Find The Multiple (DFS)
    Rikka with Nickname (简单题)
  • 原文地址:https://www.cnblogs.com/mcgrady/p/6933639.html
Copyright © 2011-2022 走看看