WinUI3入門16:Order自定義排序

初級代碼游戲的專欄介紹與文章目錄-CSDN博客

我的github:codetoys,所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。

這些代碼大部分以Linux為目標但部分代碼是純C++的,可以在任何平臺上使用。

源碼指引:github源碼指引_初級代碼游戲的博客-CSDN博客

C#是我多年以來的業余愛好,新搞的東西能用C#的就用C#了。


? ? ? ? 接上一篇繼續研究排序問題。上一篇:WinUI3入門15:DataGrid排序-CSDN博客

? ? ? ? 前一篇使用OrderBy對指定列排序,如果要同時對多列排序,或許可以用一串OrderBy來實現(因為OrderBy是穩定排序,如果相等,不會改變相對順序)。

? ? ? ? 但是首先寫一串OrderBy相當繁瑣,效果存在不確定性(依賴算法特性),其次多次排序性能可能存在問題,當然這都不是關鍵問題。

????????關鍵問題是這不符合完全自定義這個目標。傳統上(指C++)我們用傳遞一個比較函數(或函數對象)的方法來實現自定義的排序規則,在C#同樣可以通過傳遞特定的接口來實現。

目錄

一、Enumerable.Order 方法

二、ICompare

三、設計通用的比較接口


一、Enumerable.Order 方法

????????ObservableCollection<>實現了IEnumerable<T> 接口,因此可以用Order方法進行排序。Order方法接受一個IComparer<T>參數:

public static System.Linq.IOrderedEnumerable<T> Order<T> (this System.Collections.Generic.IEnumerable<T> source, System.Collections.Generic.IComparer<T>? comparer);

? ? ? ? 很明顯這個ICompare<T>就是用作比較的方法,所以問題就歸結為編寫ICompare<T>。

二、ICompare<T>

????????ICompare<T>要求如下:

public int Compare (T? x, T? y);

? ? ? ? 這個我們看著很眼熟,返回值也很眼熟:0代表相等,大于0代表x>y,小于0代表x<y,跟我們傳統的x-y是一樣的。

三、設計通用的比較接口

? ? ? ? 通常為了多列比較我們需要下面的信息:

  • 哪些列用作比較
  • 這些列的比較順序(優先級)
  • 每個列的比較方法(字符串、數值、升序降序)

? ? ? ? 因為這里是直接用屬性比較,那么字符串還是數值是不需要額外記錄的,所以要記住的就是列和升序降序,我們可以用下面的類來描述:

		public class SortColumn{public String name = "";public bool sortOrderAscending = true;//false Descending}

? ? ? ? 再定義一個列表就可以描述列的順序了:

		public List<SortColumn> sortColumns = new();

? ? ? ? 現在我們考慮把描述規則放在一個類里,而具體的比較由類自身的方法來實現。理論上通過上一篇用的動態類型(PropertyInfo)處理是可以實現完美的通用比較類的,不過有時候自定義一下也沒什么不好,可能更簡單、更高效。

? ? ? ? 整個通用部分如下:

	public interface IMyOrder<T> where T : IMyOrder<T>{int CompareTo(MyOrder<T> order, T tmp);}public class MyOrder<T> : System.Collections.Generic.IComparer<T> where T : IMyOrder<T> {public class SortColumn{public String name = "";public bool sortOrderAscending = true;//false Descending}public List<SortColumn> sortColumns = new();public MyOrder(){}//清除排序規則public void ClearSortColumn(){sortColumns.Clear();}//指定進行排序的列public void SetSortColumn(String colname){SortColumn? sortColumn = null;int index = -1;if (sortColumns.Count != 0){for (int i = 0; i < sortColumns.Count; ++i){SortColumn tmpColumn =sortColumns[i];if (tmpColumn.name == colname){sortColumn=tmpColumn;sortColumns.Remove(tmpColumn);index = i;}}}if (null == sortColumn){sortColumn = new SortColumn();sortColumn.name = colname;sortColumns.Add(sortColumn);}else{if (0 == index) sortColumn.sortOrderAscending = !sortColumn.sortOrderAscending;sortColumns.Insert(0, sortColumn);}}public int Compare(T? x, T? y){if(null==x && null==y)return 0;if (null == x) return -1;if(null==y)return 1;return x.CompareTo(this, y);}}

? ? ? ? 前面定義了一個接口IMyOrder<T>用來由實際的數據實現比較函數。而MyOrder<T>的IComparer<T>的實現“public int Compare(T? x, T? y)”則調用IMyOrder<T>的CompareTo來實現真正的比較。

? ? ? ? 最復雜的是SetSortColumn,要檢查是否是已經存在的排序列,最新點擊的排第一,如果連續點擊第一個就改變正序逆序。

? ? ? ? 數據那邊則要增加對IMyOrder<T>的實現:

		public class Data : INotifyPropertyChanged, IMyOrder<Data>{。。。。。。public int CompareTo(MyOrder<Data> order,Data tmp){for (int i = 0; i < order.sortColumns.Count; ++i){int ret = 0;MyOrder<Data>.SortColumn sortColumn = order.sortColumns[i];if (sortColumn.name == "Dir") ret = _dir.CompareTo(tmp._dir);if (sortColumn.name == "File") ret = _file.CompareTo(tmp._file);if (sortColumn.name == "Ext") ret = _ext.CompareTo(tmp._ext);if (sortColumn.name == "Type") ret = _type.CompareTo(tmp._type);if (sortColumn.name == "Encode") ret = _encode.CompareTo(tmp._encode);if (sortColumn.name == "BOM") ret = _bom.CompareTo(tmp._bom);if (sortColumn.name == "CR") ret = _cr.CompareTo(tmp._cr);if (sortColumn.name == "CRLF") ret = _crlf.CompareTo(tmp._crlf);if (sortColumn.name == "LF") ret = _lf.CompareTo(tmp._lf);if (sortColumn.name == "Length") ret = _length.CompareTo(tmp._length);if (sortColumn.name == "State") ret = _state.CompareTo(tmp._state);if (!sortColumn.sortOrderAscending) ret = -ret;if (0 != ret) return ret;}return 0;}}

? ? ? ? 主代碼中的主要過程:

		MyOrder<Data> myOrder = new();//Sorting事件添加排序列myOrder.SetSortColumn(e.Column.Header.ToString());排序newdatas = datas.Order(myOrder);


(這里是文檔結束)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913564.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913564.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913564.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 面向對象三大特性詳解:封裝、繼承與多態,掌握OOP核心思想

作為一名Java開發工程師&#xff0c;你一定知道&#xff0c;封裝&#xff08;Encapsulation&#xff09;、繼承&#xff08;Inheritance&#xff09;和多態&#xff08;Polymorphism&#xff09; 是面向對象編程&#xff08;Object-Oriented Programming, OOP&#xff09;的三大…

WPS中配置MathType教程

項目場景&#xff1a;在WPS中使用MathType問題描述&#xff1a;MathPage.wll或MathType.dll文件找不到問題原因分析&#xff1a;在C盤wps中的startup中有mathpage.wll,但配置不可用而我的WPS安裝在E盤&#xff0c;并且桌面圖標啟動路徑也是E盤路徑下的WPS路徑&#xff0c;所以不…

基于模板設計模式開發優惠券推送功能以及對過期優惠卷進行定時清理

1.模板設計模式&#xff1a;模板設計模式是一種常見的設計模式&#xff0c;主要作用是對 具體操作的 共有代碼塊進行提取&#xff0c;提升代碼復用性。那么說道代碼復用性&#xff0c;首先想到的是抽象類而不是接口。因為抽象類的本質就是為了代碼復用&#xff0c;抽象類既可以…

對象的finalization機制Test1

Java語言提供了對象終止(finalization)機制來允許開發人員自定義對象被銷毀之前的處理邏輯。當垃圾回收器發現沒有引用指向一個對象時&#xff0c;通常接下來要做的就是垃圾回收&#xff0c;即清除該對象&#xff0c;而finalization機制使得在清除此對象之前&#xff0c;總會先…

RJ45 連接器(水晶頭)的引腳定義

RJ45連接器核心定義 【】物理結構 8個金屬觸點&#xff08;Pin 1至Pin 8&#xff09;的透明塑料插頭&#xff0c;帶塑料卡榫。 引腳編號規則 卡榫朝下&#xff0c;金屬觸點面向自己時&#xff1a; 最左側為 Pin 1 最右側為 Pin 8 順序&#xff1a;Pin 1 → Pin 2 → Pin 3 → P…

小架構step系列08:logback.xml的配置

1 概述 logback.xml配置文件的詳細配置&#xff0c;很多地方都說得比較細&#xff0c;本文主要從幾個重點來看一下原理&#xff0c;了解原理能夠幫助確定哪些應該配置&#xff0c;以及如何配置。 logback.xml是為打印日志服務的&#xff0c;打印的內容一般打印到控制臺(Conso…

STM32中SPI協議詳解

前言 在嵌入式系統中&#xff0c;設備間的數據傳輸協議多種多樣&#xff0c;SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外設接口&#xff09;憑借其高速、全雙工、易用性等特點&#xff0c;成為連接STM32與高速外設&#xff08;如OLED屏、Flash芯片、AD轉換器…

TypeScript 接口全解析:從基礎到高級應用

TypeScript 接口全解析&#xff1a;從基礎到高級應用在 TypeScript 中&#xff0c;接口是定義數據結構和行為規范的強大工具&#xff0c;它能夠顯著提升代碼的可讀性、可維護性和類型安全性。本文將全面講解 TypeScript 接口的相關知識點&#xff0c;從基礎語法到高級特性&…

主存(DRAM)是什么?

主存&#xff08;DRAM&#xff09;是什么&#xff1f; 主存&#xff08;DRAM&#xff09;詳解 主存&#xff08;Main Memory&#xff09; 通常由 DRAM&#xff08;Dynamic Random Access Memory&#xff0c;動態隨機存取存儲器&#xff09; 構成&#xff0c;是計算機系統中用于…

Python 機器學習核心入門與實戰進階 Day 6 - 模型保存與加載(joblib / pickle)

? 今日目標 掌握如何將訓練好的模型持久化保存到文件熟悉兩種主流保存方式&#xff1a;joblib 和 pickle加載模型并應用于新數據預測實現完整的“訓練 → 保存 → 加載 → 預測”流程為后續部署做準備&#xff08;如 Flask、FastAPI&#xff09;&#x1f9f0; 一、模型保存工具…

【SigNoz部署安裝】Ubuntu環境部署SigNoz:Docker容器化監控的全流程指南

文章目錄前言1.關于SigNoz2.本地部署SigNoz3.SigNoz簡單使用4. 安裝內網穿透5.配置SigNoz公網地址6. 配置固定公網地址前言 在分布式架構主導的現代運維體系中&#xff0c;系統性能監控正面臨范式變革的關鍵轉折。當微服務架構遭遇服務雪崩、無服務器架構出現冷啟動延遲等復雜…

NV298NV312美光固態閃存NW639NW640

美光固態閃存技術全景解析&#xff1a;從NV298到NW640的深度探索近年來&#xff0c;美光科技憑借其在3D NAND閃存技術上的持續突破&#xff0c;推出了多款備受市場關注的固態硬盤產品。本文將從技術評測、產品對比、市場趨勢、用戶反饋及應用場景等多個維度&#xff0c;深入剖析…

2025.07.04【服務器】|使用萬兆網卡提升服務器間互聯速度,實現快速數據傳輸

文章目錄1. **萬兆網卡概述**2. **為什么選擇萬兆網卡**3. **萬兆網卡配置與安裝**3.1 **安裝網卡**3.2 **安裝驅動程序**3.3 **檢查網卡狀態**4. **配置網絡接口**4.1 **Linux 系統配置**4.2 **Windows 系統配置**5. **優化性能**5.1 **使用多線程傳輸**5.2 **開啟 TCP/UDP 窗…

光伏發電量精準估算,提升投資效益

在光伏產業規模化發展進程中&#xff0c;準確估算光伏發電量是提升項目投資效益的關鍵環節。科學的發電量預測不僅能為項目可行性研究提供依據&#xff0c;更能在電站全生命周期內優化運營策略&#xff0c;實現投資回報最大化。基于多維度數據整合與智能算法構建的精準預測體系…

Linux的互斥鎖、Linux的POSIX信號量(二值、計數)、RTOS的二值信號量

鎖和信號量最大的區別就是:鎖嚴格要求 “誰占用誰釋放”,而信號量允許 “一個任務 / 線程釋放,另一個任務 / 線程獲取”。 特性互斥鎖(Mutex)POSIX 信號量(Semaphore)初始狀態初始為 “鎖定”(PTHREAD_MUTEX_INITIALIZER),需顯式獲取(pthread_mutex_lock)。初始值可…

基于Java+SpringBoot 協同過濾算法私人診所管理系統

源碼編號&#xff1a;S607源碼名稱&#xff1a;基于SpringBoot5的協同過濾算法的私人診所管理系統用戶類型&#xff1a;雙角色&#xff0c;患者、醫生、管理員數據庫表數量&#xff1a;15 張表主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven運行環境&#xff1…

什么是DINO?

DINO 是一個由 Meta AI (當時的 Facebook AI) 在 2021 年提出的自監督學習框架&#xff0c;其全稱是 “self-DIstillation with NO labels”&#xff0c;直譯為“無標簽的自我蒸餾”。這個名字精準地概括了它的核心思想。 DINO 的出現是一個里程碑&#xff0c;因為它首次有力地…

如何在 Android Framework層面控制高通(Qualcomm)芯片的 CPU 和 GPU。

如何在 Android Framework層面控制高通&#xff08;Qualcomm&#xff09;芯片的 CPU 和 GPU。 參考&#xff1a;https://blog.csdn.net/YoungHong1992/article/details/117047839?utm_source%20%20uc_fansmsg 作為一名 Framework 開發者&#xff0c;您擁有系統級的權限&#…

程序員在線接單

十年Java全棧工程師在線接單Java程序代做&#xff0c;兼職接單&#xff0c;系統代做&#xff0c;二次開發&#xff0c;網站開發部署&#xff0c;項目合作&#xff0c;商業項目承包 全棧開發&#xff0c;支持定制各種管理系統、小程序 商用或個人使用等項目都接 服務二: Java調試…

Python 異步爬蟲(aiohttp)高效抓取新聞數據

一、異步爬蟲的優勢 在傳統的同步爬蟲中&#xff0c;爬蟲在發送請求后會阻塞等待服務器響應&#xff0c;直到收到響應后才會繼續執行后續操作。這種模式在面對大量請求時&#xff0c;會導致大量的時間浪費在等待響應上&#xff0c;爬取效率較低。而異步爬蟲則等待可以在服務器…