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

C#獲取不重復(fù)的編碼的最佳實(shí)踐

 更新時(shí)間:2025年09月22日 09:10:26   作者:code bean  
本文針對軟件開發(fā)中“為新對象分配唯一編碼”的常見需求,以C#通信設(shè)備管理場景為例,從原始代碼分析入手,逐步講解基于LINQ和哈希集合的優(yōu)化方案,幫助開發(fā)者理解不同場景下的最佳實(shí)踐,需要的朋友可以參考下

一、需求背景:為什么需要“不重復(fù)編碼”?

在業(yè)務(wù)開發(fā)中,“編碼唯一性”是保障數(shù)據(jù)準(zhǔn)確性的基礎(chǔ)要求。以通信設(shè)備管理系統(tǒng)為例:

  • 系統(tǒng)維護(hù)一個通信模塊集合ComList(存儲ICommunication類型對象)
  • 每個新接入的通信模塊(ec)需分配唯一Encode
  • Encode重復(fù),會導(dǎo)致設(shè)備標(biāo)識混亂,引發(fā)查詢錯誤、指令發(fā)送失敗等問題

因此,在將新模塊添加到集合前,必須先找到一個“未被使用的編碼”,這是確保系統(tǒng)穩(wěn)定運(yùn)行的關(guān)鍵步驟。

二、原始實(shí)現(xiàn):邏輯可行但不夠優(yōu)雅

先看一段常見的原始代碼,核心思路是“從0開始逐個檢查,直到找到未使用的編碼”:

// 原始代碼:獲取不重復(fù)編碼
bool flag = false;
int encode = 0;
do
{
    flag = true; // 假設(shè)當(dāng)前編碼可用
    // 遍歷集合檢查編碼是否已存在
    foreach (ICommunication tempEC in ComList)
    {
        if (tempEC.Encode == encode)
        {
            encode++; // 編碼已使用,自增后重新檢查
            flag = false;
            break; // 跳出foreach,進(jìn)入下一輪do-while
        }
    }
    // 若編碼可用,跳出循環(huán)
    if (flag == true)
    {
        break;
    }
} while (true);

// 為新模塊賦值并添加到集合
key = key + encode;
ec.Key = key;
ec.Encode = encode;
ComList.Add(ec);

原始代碼的問題

  1. 冗余標(biāo)記變量:用flag控制循環(huán)退出,增加理解成本(實(shí)際可通過循環(huán)條件直接表達(dá))
  2. 嵌套層次深do-while嵌套foreach,再嵌套if,代碼結(jié)構(gòu)復(fù)雜
  3. 重復(fù)遍歷:每次檢查都需手動遍歷集合,未利用現(xiàn)有工具簡化邏輯

三、第一次優(yōu)化:用LINQ簡化邏輯

C#的LINQ(Language Integrated Query) 提供了豐富的集合操作方法,其中Any()方法可直接判斷“集合是否存在滿足條件的元素”,能大幅簡化代碼。

1. 優(yōu)化后代碼

// 優(yōu)化方案1:基于LINQ的簡潔實(shí)現(xiàn)
int encode = 0;
// 循環(huán)條件:若集合中存在該編碼,則繼續(xù)自增檢查
while (ComList.Any(ec => ec.Encode == encode))
{
    encode++;
}

// 后續(xù)賦值與添加邏輯不變
key = key + encode;
ec.Key = key;
ec.Encode = encode;
ComList.Add(ec);

2. 核心邏輯解析:ComList.Any(ec => ec.Encode == encode)

這行代碼是優(yōu)化的核心,拆解理解:

  • ComList:待檢查的通信模塊集合(存儲ICommunication對象)
  • Any()方法:LINQ擴(kuò)展方法,作用是“判斷集合是否至少存在一個滿足條件的元素”
    • 返回值:bool(存在則true,不存在則false
    • 優(yōu)勢:短路求值——找到第一個滿足條件的元素后,立即停止遍歷,避免無效循環(huán)
  • ec => ec.Encode == encode:lambda表達(dá)式(匿名函數(shù)),定義判斷規(guī)則
    • ec:集合中元素的臨時(shí)變量(可理解為“each communication”,建議取有意義的名稱)
    • ec.Encode:獲取當(dāng)前模塊的編碼屬性
    • == encode:判斷當(dāng)前編碼是否與待分配的encode重復(fù)

通俗解釋:檢查ComList中是否有任何一個模塊的Encode等于當(dāng)前encode值。若有(返回true),則encode自增繼續(xù)檢查;若無(返回false),則找到可用編碼,循環(huán)結(jié)束。

3. 優(yōu)化點(diǎn)總結(jié)

  • 去除flag變量,用while條件直接控制退出,邏輯更直觀
  • 消除嵌套層次,代碼從“嵌套結(jié)構(gòu)”變?yōu)?ldquo;線性結(jié)構(gòu)”,可讀性提升
  • 代碼量減少60%+,同時(shí)保持功能完全一致

四、第二次優(yōu)化:大數(shù)據(jù)量場景的性能提升

方案1在中小數(shù)據(jù)量(如ComList元素<1000)場景下足夠高效,但當(dāng)集合元素極多(如萬級以上)或需頻繁分配編碼時(shí),每次調(diào)用ComList.Any()都需遍歷集合,性能會下降。

此時(shí)可通過哈希集合(HashSet) 優(yōu)化——哈希集合的Contains方法時(shí)間復(fù)雜度為O(1),遠(yuǎn)快于普通集合的O(n)

1. 優(yōu)化思路

  1. 預(yù)提取ComList中所有已使用的Encode,存入HashSet<int>
  2. 基于哈希集合的Contains方法檢查編碼是否重復(fù),大幅減少查找時(shí)間

2. 優(yōu)化后代碼

// 優(yōu)化方案2:大數(shù)據(jù)量場景下的高性能實(shí)現(xiàn)
// 步驟1:預(yù)提取已使用的編碼到哈希集合
var existingEncodes = new HashSet<int>(ComList.Select(ec => ec.Encode));

// 步驟2:檢查可用編碼
int encode = 0;
while (existingEncodes.Contains(encode))
{
    encode++;
}

// 后續(xù)賦值與添加邏輯不變
key = key + encode;
ec.Key = key;
ec.Encode = encode;
ComList.Add(ec);

3. 關(guān)鍵代碼解析

  • ComList.Select(ec => ec.Encode):LINQ的Select方法“投影”集合元素,將ICommunication對象轉(zhuǎn)換為其Encode屬性(得到IEnumerable<int>序列)
  • new HashSet<int>(...):通過序列初始化哈希集合,存儲所有已使用的編碼
  • existingEncodes.Contains(encode):哈希集合的快速查找方法,無論集合大小,均能瞬間判斷編碼是否存在

4. 適用場景

  • ComList元素?cái)?shù)量多(如>1000)
  • 短時(shí)間內(nèi)頻繁添加新模塊(需多次獲取不重復(fù)編碼)

注意:若數(shù)據(jù)量小,方案2的“哈希集合初始化開銷”可能大于遍歷節(jié)省的時(shí)間,反而得不償失,此時(shí)方案1更優(yōu)。

五、總結(jié):不同場景的方案選擇

場景推薦方案核心優(yōu)勢時(shí)間復(fù)雜度
中小數(shù)據(jù)量(<1000)LINQ Any()代碼簡潔、無額外開銷O(n)
大數(shù)據(jù)量/頻繁操作哈希集合查找速度極快O(1)
原始實(shí)現(xiàn)不推薦邏輯冗余、可讀性差O(n²)

最終推薦代碼(通用場景)

若不確定數(shù)據(jù)量,可優(yōu)先使用方案1(LINQ實(shí)現(xiàn)),代碼簡潔且滿足多數(shù)業(yè)務(wù)需求:

// 完整通用實(shí)現(xiàn)代碼
using System;
using System.Collections.Generic;
using System.Linq; // 需引用LINQ命名空間

// 假設(shè)的通信模塊接口
public interface ICommunication
{
    int Encode { get; set; }
    string Key { get; set; }
}

// 通信模塊實(shí)現(xiàn)類
public class CommunicationModule : ICommunication
{
    public int Encode { get; set; }
    public string Key { get; set; }
}

public class CommunicationManager
{
    // 通信模塊集合
    private List<ICommunication> ComList = new List<ICommunication>();

    // 添加新通信模塊(核心方法)
    public void AddNewModule(string keyPrefix)
    {
        // 1. 獲取不重復(fù)編碼
        int encode = 0;
        while (ComList.Any(ec => ec.Encode == encode))
        {
            encode++;
        }

        // 2. 為新模塊賦值
        ICommunication ec = new CommunicationModule();
        string key = keyPrefix + encode;
        ec.Key = key;
        ec.Encode = encode;

        // 3. 添加到集合
        ComList.Add(ec);
        Console.WriteLine($"新模塊添加成功:Key={key},Encode={encode}");
    }
}

六、拓展思考

  1. 編碼起始值:若需從非0值(如100)開始分配編碼,只需將int encode = 0改為int encode = 100即可
  2. 編碼步長:若需按固定步長(如2)分配編碼,可將encode++改為encode += 2
  3. 并發(fā)安全:若多線程同時(shí)添加模塊,需在編碼檢查和添加集合時(shí)加鎖(如lock(ComList)),避免并發(fā)沖突

到此這篇關(guān)于C#獲取不重復(fù)的編碼的最佳實(shí)踐的文章就介紹到這了,更多相關(guān)C#獲取不重復(fù)編碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#?Web實(shí)現(xiàn)文件上傳的示例詳解

    C#?Web實(shí)現(xiàn)文件上傳的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C#?Web實(shí)現(xiàn)文件上傳的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • C#如何通過probing指定dll尋找文件夾詳解

    C#如何通過probing指定dll尋找文件夾詳解

    這篇文章主要給大家介紹了關(guān)于C#如何通過probing指定dll尋找文件夾的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 如何在C#中自動化生成PDF表格

    如何在C#中自動化生成PDF表格

    在現(xiàn)代商業(yè)應(yīng)用中,PDF文檔因其跨平臺、內(nèi)容固定和易于共享的特性,成為信息傳遞的重要載體,本文將深入探討C#如何使用Spire.PDF for .NET創(chuàng)建和定制PDF表格,感興趣可以了解下
    2025-11-11
  • C# OpenCVSharp實(shí)現(xiàn)顏色空間轉(zhuǎn)換功能

    C# OpenCVSharp實(shí)現(xiàn)顏色空間轉(zhuǎn)換功能

    OpenCVSharp 是 OpenCV 的 C# 封裝,允許開發(fā)者在 .NET 環(huán)境下使用 OpenCV 提供的強(qiáng)大計(jì)算機(jī)視覺和圖像處理功能,它支持大多數(shù) OpenCV 的功能,包括圖像讀取、處理、特征檢測、機(jī)器學(xué)習(xí)等,所以本文給大家介紹了C# OpenCVSharp實(shí)現(xiàn)顏色空間轉(zhuǎn)換功能,需要的朋友可以參考下
    2025-09-09
  • UGUI繪制動態(tài)曲線

    UGUI繪制動態(tài)曲線

    這篇文章主要為大家詳細(xì)介紹了UGUI繪制動態(tài)曲線的具體方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • C# WinForm實(shí)現(xiàn)自動更新程序的方法詳解

    C# WinForm實(shí)現(xiàn)自動更新程序的方法詳解

    這一篇就著重寫一下客戶端的代碼,客戶端主要實(shí)現(xiàn)的有:啟動后檢測本地的xml文件,然后發(fā)送到服務(wù)器獲取需要更新的文件以及版本列表,感興趣的小伙伴可以了解一下
    2022-10-10
  • WPF中實(shí)現(xiàn)彈出進(jìn)度條窗口的示例詳解

    WPF中實(shí)現(xiàn)彈出進(jìn)度條窗口的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何WPF中實(shí)現(xiàn)彈出進(jìn)度條窗口,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • C#無損高質(zhì)量壓縮圖片實(shí)現(xiàn)代碼

    C#無損高質(zhì)量壓縮圖片實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C#無損高質(zhì)量壓縮圖片的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 關(guān)于C#中排序函數(shù)的總結(jié)

    關(guān)于C#中排序函數(shù)的總結(jié)

    下面小編就為大家?guī)硪黄P(guān)于C#中排序函數(shù)的總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • C#中的GDI+圖像編程詳解

    C#中的GDI+圖像編程詳解

    本文詳細(xì)講解了C#中的GDI+圖像編程,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評論

瓦房店市| 萨嘎县| 永昌县| 通化市| 承德县| 南漳县| 景宁| 那坡县| 大邑县| 安远县| 凤台县| 彭州市| 横峰县| 广灵县| 巴林左旗| 饶河县| 玛多县| 晋州市| 将乐县| 通城县| 辉南县| 旬邑县| 于田县| 饶平县| 鄂伦春自治旗| 西青区| 泾源县| 宣城市| 嘉兴市| 哈密市| 满城县| 陇川县| 容城县| 佛冈县| 化州市| 澄迈县| 忻州市| 横峰县| 清水县| 新河县| 河北区|