最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中SortedSet的具體使用

 更新時間:2025年08月13日 11:22:58   作者:楓景Maple  
SortedSet是 .NET Framework 4.0引入的一個泛型集合類,它實現了一個自動排序的集合,內部使用紅黑樹數據結構來維護元素的有序性,下面就來介紹一下如何使用

基礎概念

SortedSet 是 C# 中的一個集合類型,位于 System.Collections.Generic 命名空間下。它是一個自動排序的集合,用于存儲不重復的元素,并且會根據元素的自然順序(默認排序)或自定義比較器進行排序,內部使用紅黑樹數據結構來維護元素的有序性。

  • 自動排序:每次添加或刪除元素時,SortedSet 都會自動調整以保持元素的排序狀態(tài)。
  • 不重復元素:SortedSet 不允許重復的元素。如果嘗試添加一個已經存在的元素,該操作會被忽略。
  • 高效性:SortedSet 內部使用紅黑樹(一種自平衡二叉搜索樹)實現,因此查找、插入和刪除操作的時間復雜度為 O(log n)

主要特性

  • 自動保持元素排序:元素會根據其自然順序(需實現 IComparable<T> 接口)或自定義比較器(IComparer<T>)排序。
  • 不包含重復元素:嘗試添加已有元素時,Add 方法返回 false,集合保持不變。
  • 支持集合操作:提供并集、交集、差集等操作。
  • 支持子集視圖:可以通過方法獲取某個范圍內的元素。
  • 快速訪問邊界值:提供 Min 和 Max 屬性,快速獲取最小和最大元素。

創(chuàng)建和初始化

基本創(chuàng)建方式

使用默認比較器(升序)

// 使用默認比較器(升序)
SortedSet<int> numbers = new SortedSet<int>();

 使用自定義比較器

// 使用自定義比較器
SortedSet<string> names = new SortedSet<string>(StringComparer.OrdinalIgnoreCase);

從現有集合創(chuàng)建

// 從現有集合創(chuàng)建
int[] array = { 5, 2, 8, 1, 9 };
SortedSet<int> sortedNumbers = new SortedSet<int>(array);
// 結果:{1, 2, 5, 8, 9}

使用集合初始化器

// 使用集合初始化器
SortedSet<string> fruits = new SortedSet<string> { "Apple", "Banana", "Cherry" };

自定義比較器

降序排列

// 降序排列
SortedSet<int> descendingNumbers = new SortedSet<int>(Comparer<int>.Create((x, y) => y.CompareTo(x)));

自定義對象排序

// 自定義對象排序
public class Person : IComparable<Person>
{
    public string Name { get; set; }
    public int Age { get; set; }
    
    public int CompareTo(Person other)
    {
        if (other == null) return 1;
        return this.Age.CompareTo(other.Age); // 按年齡排序
    }
}

SortedSet<Person> people = new SortedSet<Person>();

使用自定義比較器

// 或使用自定義比較器
SortedSet<Person> peopleByName = new SortedSet<Person>(
    Comparer<Person>.Create((p1, p2) => string.Compare(p1.Name, p2.Name))
);

基本操作

添加和刪除元素

SortedSet<int> numbers = new SortedSet<int>();

添加元素

// 添加元素
bool added1 = numbers.Add(5);    // true,成功添加
bool added2 = numbers.Add(3);    // true,成功添加
bool added3 = numbers.Add(5);    // false,元素已存在

Console.WriteLine(string.Join(", ", numbers)); // 輸出:3, 5

刪除元素

// 刪除元素
bool removed = numbers.Remove(3); // true,成功刪除
numbers.Remove(10);  

清空集合

// 清空集合
numbers.Clear();

查詢操作

SortedSet<int> numbers = new SortedSet<int> { 1, 3, 5, 7, 9 };

檢查元素是否存在

// 檢查元素是否存在
bool contains = numbers.Contains(5); // true

獲取元素數量

// 獲取元素數量
int count = numbers.Count; // 5

檢查是否為空

// 檢查是否為空
bool isEmpty = numbers.Count == 0; // false

獲取最小值和最大值

// 獲取最小值和最大值
int min = numbers.Min; // 1
int max = numbers.Max; // 9

范圍查詢

使用 GetViewBetween 方法獲取指定范圍內的元素子集

SortedSet<int> numbers = new SortedSet<int> { 1, 3, 5, 7, 9, 11, 13 };

// 獲取視圖(不創(chuàng)建新集合)
SortedSet<int> subset1 = numbers.GetViewBetween(3, 9);
// 結果:{3, 5, 7, 9}

SortedSet<int> subset2 = numbers.GetViewBetween(4, 10);
// 結果:{5, 7, 9}

// 視圖會反映原集合的變化
numbers.Add(6);
Console.WriteLine(string.Join(", ", subset2)); // 輸出:5, 6, 7, 9

集合運算

并集、交集、差集

SortedSet<int> set1 = new SortedSet<int> { 1, 2, 3, 4, 5 };
SortedSet<int> set2 = new SortedSet<int> { 4, 5, 6, 7, 8 };

并集:UnionWith 將另一個集合的元素合并到 SortedSet 中。

// 并集(修改 set1)
set1.UnionWith(set2);
Console.WriteLine(string.Join(", ", set1)); // 1, 2, 3, 4, 5, 6, 7, 8

交集:IntersectWith 保留與另一個集合的交集。

// 重新初始化
set1 = new SortedSet<int> { 1, 2, 3, 4, 5 };

// 交集(修改 set1)
set1.IntersectWith(set2);
Console.WriteLine(string.Join(", ", set1)); // 4, 5

差集:ExceptWith 刪除與另一個集合相交的元素。

// 重新初始化
set1 = new SortedSet<int> { 1, 2, 3, 4, 5 };

// 差集(set1 中有但 set2 中沒有的元素)
set1.ExceptWith(set2);
Console.WriteLine(string.Join(", ", set1)); // 1, 2, 3

對稱差集:SymmetricExceptWith 兩個集合中不共同擁有的元素

// 對稱差集(兩個集合中不共同擁有的元素)
set1 = new SortedSet<int> { 1, 2, 3, 4, 5 };
set1.SymmetricExceptWith(set2);
Console.WriteLine(string.Join(", ", set1)); // 1, 2, 3, 6, 7, 8

集合關系判斷

SortedSet<int> set1 = new SortedSet<int> { 1, 2, 3 };
SortedSet<int> set2 = new SortedSet<int> { 1, 2, 3, 4, 5 };
SortedSet<int> set3 = new SortedSet<int> { 2, 3 };
SortedSet<int> set4 = new SortedSet<int> { 6, 7 };

子集判斷

// 子集判斷

bool isSubset = set1.IsSubsetOf(set2);        // true
bool isProperSubset = set1.IsProperSubsetOf(set2); // true
bool isSuperset = set2.IsSupersetOf(set1);    // true
bool isProperSuperset = set2.IsProperSupersetOf(set1); // true

重疊判斷

// 重疊判斷
bool overlaps = set1.Overlaps(set3);          // true(有共同元素2,3)
bool overlaps2 = set1.Overlaps(set4);         // false(無共同元素)

相等判斷

// 相等判斷
bool areEqual = set1.SetEquals(set3);         // false

遍歷和枚舉

基本遍歷

SortedSet<string> fruits = new SortedSet<string> { "Banana", "Apple", "Cherry" };

foreach 遍歷(按排序順序)

// foreach 遍歷(按排序順序)
foreach (string fruit in fruits)
{
    Console.WriteLine(fruit); // Apple, Banana, Cherry
}

使用枚舉器

// 使用枚舉器
using (var enumerator = fruits.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        Console.WriteLine(enumerator.Current);
    }
}

反向遍歷

SortedSet<int> numbers = new SortedSet<int> { 1, 3, 5, 7, 9 };

// 反向遍歷
foreach (int number in numbers.Reverse())
{
    Console.WriteLine(number); // 9, 7, 5, 3, 1
}

SortedSet 的優(yōu)點和適用場景

優(yōu)點

  • 自動保持元素排序,無需手動干預。
  • 確保元素唯一性,避免重復。
  • 高效的操作性能(O(log n))。
  • 支持集合操作和子集視圖。

適用場景

  • 需要有序且不重復的元素集合,例如排行榜、時間線。
  • 實現優(yōu)先級隊列(盡管 C# 有 PriorityQueue<T>)。
  • 執(zhí)行集合操作,如并集、交集等。

SortedSet 與其他集合類型的區(qū)別

  • 與 HashSet<T> 的區(qū)別
    • HashSet<T> 不保持順序,查找時間為 O(1)。
    • SortedSet<T> 保持順序,查找時間為 O(log n)。
  • 與 List<T> 的區(qū)別
    • List<T> 允許重復元素,不自動排序。
    • SortedSet<T> 不允許重復,自動排序。
  • 與 SortedList<TKey, TValue> 的區(qū)別
    • SortedList<TKey, TValue> 是鍵值對集合,鍵排序。
    • SortedSet<T> 是元素集合,元素本身排序。

到此這篇關于C#中SortedSet的具體使用的文章就介紹到這了,更多相關C# SortedSet內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • C#中字符串編碼處理

    C#中字符串編碼處理

    C#中字符串編碼處理,需要的朋友可以參考一下
    2013-03-03
  • C#調用C++ DLL bool返回值始終為true的問題

    C#調用C++ DLL bool返回值始終為true的問題

    這篇文章主要介紹了C#調用C++ DLL bool返回值始終為true的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C#中多維數組[,]和交錯數組[][]的區(qū)別

    C#中多維數組[,]和交錯數組[][]的區(qū)別

    這篇文章介紹了C#中多維數組[,]和交錯數組[][]的區(qū)別,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • C#/VB.NET 給Excel添加、刪除數字簽名的方法

    C#/VB.NET 給Excel添加、刪除數字簽名的方法

    這篇文章主要介紹了C#/VB.NET 給Excel添加、刪除數字簽名的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • c#自帶緩存使用方法 c#移除清理緩存

    c#自帶緩存使用方法 c#移除清理緩存

    這篇文章主要介紹了c#自帶緩存使用方法,包括獲取數據緩存、設置數據緩存、移除指定數據緩存等方法,需要的朋友可以參考下
    2014-02-02
  • WPF實現繪制3D圖形的示例代碼

    WPF實現繪制3D圖形的示例代碼

    WPF的3D功能可以在不編寫任何c#代碼的情況下進行繪制,只需要使用xaml即可完成3D圖形的渲染。本文主要講述了WPF-3D中的關鍵概念, 以及常用到的命中測試、2d控件如何在3D對象中進行渲染,希望大家有所幫助
    2023-03-03
  • C#實現可捕獲幾乎所有鍵盤鼠標事件的鉤子類完整實例

    C#實現可捕獲幾乎所有鍵盤鼠標事件的鉤子類完整實例

    這篇文章主要介紹了C#實現可捕獲幾乎所有鍵盤鼠標事件的鉤子類,以完整實例形式分析了C#捕獲鍵盤鼠標事件的鉤子操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • C#觀察者模式(Observer Pattern)實例教程

    C#觀察者模式(Observer Pattern)實例教程

    這篇文章主要介紹了C#觀察者模式(Observer Pattern),主要以一個實例的形式講述了C#觀察者模式的實現過程,詳細講述了接口的定義、通知及動作的實現方法,需要的朋友可以參考下
    2014-09-09
  • C#判斷字符編碼的方法總結(六種方法)

    C#判斷字符編碼的方法總結(六種方法)

    這篇文章主要介紹了C#判斷字符編碼的方法,結合實例形式總結分析了六種C#判斷字符編碼的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • 使用C#實現插入各種表格到Word文檔

    使用C#實現插入各種表格到Word文檔

    在許多企業(yè)應用場景中,Word 文檔依舊是最常用的信息呈現與內容輸出格式,下面將介紹在 C# 中如何以編程方式創(chuàng)建 Word 文檔、插入表格、設置樣式,并擴展到動態(tài)行列與嵌套表格等高級操作,希望對大家有所幫助
    2025-11-11

最新評論

瑞安市| 清徐县| 塔城市| 历史| 徐汇区| 桐城市| 毕节市| 吴川市| 东乡族自治县| 灵武市| 蓬安县| 南宫市| 九龙城区| 平原县| 务川| 三门峡市| 北京市| 江孜县| 玛纳斯县| 冀州市| 邹平县| 恩平市| 德保县| 论坛| 湖州市| 隆安县| 林州市| 盐边县| 南澳县| 凤台县| 西乌珠穆沁旗| 府谷县| 磴口县| 朝阳市| 海晏县| 甘孜县| 黑水县| 武平县| 桐乡市| 永德县| 五指山市|