常用的去重和排序

来源:http://www.cnblogs.com/mcgrady/archive/2017/06/02/6933639.html
-Advertisement-
Play Games

去重和排序是開發過程中經常碰到的問題,這篇文章就來總結一下。 去重 方法1:使用內置的distinct 代碼如下: //方法1:使用預設的distinct方法 //只能針對基元類型列表,對於自定義類型組合欄位條件需要自定義相等比較器實現IEqualityComparer介面,比較麻煩 var res... ...


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

去重

方法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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天發現線上資料庫主從延遲嚴重: 從庫大量日誌沒有做,當時就想到可能是從庫有事物沒有執行完畢,查看了一下未結束的事物和鎖信息,發現並不是這個原因,查看錯誤日誌: 消息Timeout occurred while waiting for latch: class 'COLUMNSTORE_ROWGRO ...
  • Redis 小白指南(二)- 聊聊五大類型:字元串、散列、列表、集合和有序集合 引言 開篇《Redis 小白指南(一)- 簡介、安裝、GUI 和 C# 驅動介紹》已經介紹了 Redis 的安裝、GUI 和 C# 驅動等基本知識,這一篇主要是梳理一下 Redis 的 5 種類型的信息與指令。 目錄 字 ...
  • 在之前一段時間裡面,我的基類多數使用lock和Hashtable組合實現多線程內緩存的衝突處理,不過有時候使用這兩個搭配並不盡如人意,偶爾還是出現了集合已經加入的異常,對代碼做多方的處理後依然如故,最後採用了.NET 4.0後才引入的ConcurrentDictionary多線程同步字典集合,問題順... ...
  • 本文轉自:https://code.msdn.microsoft.com/Support-Composite-Key-in-d1d53161 he default EntitySetController doesn't support composite keys. So if you have c ...
  • 本文轉自:http://chris.eldredge.io/blog/2014/04/24/Composite-Keys/ In our basic configuration we told the model builder that our entity has a composite key ...
  • 微軟期待聆聽您的聲音 尊敬的開發者,你們好,我們誠邀您參與微軟雲時代開發者調研活動。您的反饋對於微軟至關重要,可以幫助我們為開發者社區提供更多有針對性的內容和雲資源支持,以幫助開發者取得更大成功。 希望您不要錯過本次機會,請將您作為開發者的體驗告訴我們。 為了感謝您的參與,我們將為每一名完成調研的用 ...
  • 9.1 可選參數和命名參數 9.1.1 規則和原則 可為方法、構造器方法和有參屬性(C 索引器)的參數指定預設值。還可為屬於委托定義一部分的參數指定預設值。 有預設值的參數必須放在沒有預設值的所有參數之後。但有一個例外:“參數數組”這種參數必須放在所有參數(包括有預設值的這些)之後,而且數組本身不能 ...
  • EasyLoader(簡單載入) 對象的屬性和方法: 使用: easyloader.theme = "bootstrap"; easyloader.locale = "zh_CH"; easyloader.load("dialog",function() { dialoginit()... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...