經常使用的去重和排序

去重和排序是開發過程當中常常碰到的問題,這篇文章就來總結一下。api

去重

方法1:使用內置的distinct測試

代碼以下:this

//方法1:使用默認的distinct方法
//只能針對基元類型列表,對於自定義類型組合字段條件須要自定義相等比較器實現IEqualityComparer接口,比較麻煩
var result1 = list.Distinct().ToList();

方法2:使用GroupByspa

代碼以下:code

//方法2:使用GroupBy
var result2 = list.GroupBy(p => new { p.BunkCode, p.BunkPrice })
    .Select(p => p.First())
    .ToList();

方法3:使用本身擴展的DistinctBy方法blog

代碼以下:排序

//方法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();
}

 

同時,我把擴展方法也貼出來:element

/// <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

相關文章
相關標籤/搜索