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

C#集合數(shù)據(jù)去重的5種方式及對比分析

 更新時間:2024年11月29日 08:28:31   作者:追逐時光者  
今天我們一起來討論一下關(guān)于C#集合數(shù)據(jù)去重的5種方式并且使用BenchmarkDotNet對這5種方式進(jìn)行性能基準(zhǔn)對比測試分析,每種方法都有其特點(diǎn)和適用場景,我們可以根據(jù)具體需求和執(zhí)行效率選擇一種進(jìn)行使用,需要的朋友可以參考下

BenchmarkDotNet介紹

BenchmarkDotNet是一個基于.NET開源、功能全面、易于使用的性能基準(zhǔn)測試框架,它為.NET開發(fā)者提供了強(qiáng)大的性能評估和優(yōu)化能力。通過自動化測試、多平臺支持、高級統(tǒng)計(jì)分析和自定義配置等特性,BenchmarkDotNet幫助開發(fā)者更好地理解和優(yōu)化軟件系統(tǒng)的性能表現(xiàn)。

使用HashSet去重

C# 中的 HashSet 是一種集合類型,它確保其中的元素是唯一的,不允許重復(fù)值的存在。當(dāng)你嘗試向 HashSet 中添加一個重復(fù)的元素時,HashSet 會忽略重復(fù)的值,而不會引發(fā)錯誤。這使得 HashSet 成為一個非常方便的數(shù)據(jù)結(jié)構(gòu),用于存儲一組唯一的元素,并且在需要時可以高效地進(jìn)行查找、插入和刪除操作,注意HashSet中的元素是無序的。

        /// <summary>
        /// 使用HashSet去重
        /// TODO:HashSet是一個集合類,它的特點(diǎn)是不允許重復(fù)元素,可以方便地實(shí)現(xiàn)去重功能。
        /// </summary>
        public static void HashSetDuplicate()
        {
            var dataSource = new List<int>() { 1, 2, 3, 2, 5, 88, 99, 99, 100, 88, 30, 50, 15, 100, 99, 99, 2, 3 };
            HashSet<int> uniqueData = new HashSet<int>(dataSource);

            Console.WriteLine(string.Join(", ", uniqueData));
        }

使用循環(huán)遍歷去重

        /// <summary>
        /// 直接循環(huán)遍歷去重
        /// </summary>
        public static void LoopTraversalDuplicate()
        {
            var dataSource = new List<int>() { 1, 2, 3, 2, 5, 88, 99, 99, 100, 88, 30, 50, 15, 100, 99, 99, 2, 3 };
            var uniqueData = new List<int>();
            foreach (var item in dataSource)
            {
                //if (!uniqueData.Any(x => x == item))
                //if (!uniqueData.Exists(x => x == item))
                if (!uniqueData.Contains(item))
                {
                    uniqueData.Add(item);
                }
            }
            Console.WriteLine(string.Join(", ", uniqueData));
        }

使用Linq的Distinct()方法去重

Linq中的Distinct()方法用于從集合中篩選出不重復(fù)的元素。Distinct()方法基于元素的相等性來進(jìn)行篩選,并返回一個包含不重復(fù)元素的新序列。底層實(shí)現(xiàn)還是使用到了HashSet。

        /// <summary>
        /// 使用Linq的Distinct()方法去重
        /// </summary>
        public static void DistinctDuplicate()
        {
            var dataSource = new List<int>() { 1, 2, 3, 2, 5, 88, 99, 99, 100, 88, 30, 50, 15, 100, 99, 99, 2, 3 };
            var uniqueData = dataSource.Distinct().ToList();

            Console.WriteLine(string.Join(", ", uniqueData));
        }

使用Linq的GroupBy()方法去重

GroupBy()方法將原始集合中的元素進(jìn)行分組,根據(jù)指定的鍵或條件進(jìn)行分組。每個分組都會有一個唯一的鍵,通過將原始集合分組并選擇每個分組中的第一個元素,實(shí)現(xiàn)了去重的效果。

        /// <summary>
        /// 使用Linq的GroupBy()方法去重
        /// </summary>
        public static void GroupByDuplicate()
        {
            var dataSource = new List<int>() { 1, 2, 3, 2, 5, 88, 99, 99, 100, 88, 30, 50, 15, 100, 99, 99, 2, 3 };

            //GroupBy()方法將原始集合中的元素進(jìn)行分組,根據(jù)指定的鍵或條件進(jìn)行分組。每個分組都會有一個唯一的鍵,通過將原始集合分組并選擇每個分組中的第一個元素,實(shí)現(xiàn)了去重的效果。
            var uniqueData = dataSource.GroupBy(item => item).Select(group => group.First()).ToList();

            Console.WriteLine(string.Join(", ", uniqueData));
        }

使用自定義的比較器和循環(huán)遍歷

        /// <summary>
        /// 使用自定義的比較器和循環(huán)遍歷
        /// </summary>
        public static void CustomEqualityComparerDuplicate()
        {
            var dataSource = new List<int>() { 1, 2, 3, 2, 5, 88, 99, 99, 100, 88, 30, 50, 15, 100, 99, 99, 2, 3 };
            var uniqueData = new List<int>();
            foreach (var item in dataSource)
            {
                if (!uniqueData.Contains(item, new CustomEqualityComparer()))
                {
                    uniqueData.Add(item);
                }
            }
            Console.WriteLine(string.Join(", ", uniqueData));
        }

        /// <summary>
        /// 自定義的比較器
        /// </summary>
        public class CustomEqualityComparer : IEqualityComparer<int>
        {
            public bool Equals(int x, int y)
            {
                return x == y;
            }

            public int GetHashCode(int obj)
            {
                return obj.GetHashCode();
            }
        }

性能基準(zhǔn)對比測試分析

接下來我們使用BenchmarkDotNet對這5種集合去重的方式進(jìn)行性能基準(zhǔn)對比測試分析。

測試代碼

using BenchmarkDotNet.Attributes;

namespace BenchmarkDotNetExercise
{
    [MemoryDiagnoser]//記錄內(nèi)存分配情況
    public class DataSetDeduplicationBenchmark
    {
        private List<int> dataSource;

        public DataSetDeduplicationBenchmark()
        {
            // 生成大量重復(fù)數(shù)據(jù)  
            dataSource = Enumerable.Repeat(Enumerable.Range(1, 100), 10000).SelectMany(x => x).ToList();
        }

        /// <summary>
        /// 使用HashSet去重
        /// TODO:HashSet是一個集合類,它的特點(diǎn)是不允許重復(fù)元素,可以方便地實(shí)現(xiàn)去重功能。
        /// </summary>
        [Benchmark]
        public void HashSetDuplicate()
        {
            HashSet<int> uniqueData = new HashSet<int>(dataSource);
        }

        /// <summary>
        /// 直接循環(huán)遍歷去重
        /// </summary>
        [Benchmark]
        public void LoopTraversalDuplicate()
        {
            var uniqueData = new List<int>();
            foreach (var item in dataSource)
            {
                //if (!uniqueData.Any(x => x == item))
                //if (!uniqueData.Exists(x => x == item))
                if (!uniqueData.Contains(item))
                {
                    uniqueData.Add(item);
                }
            }
        }

        /// <summary>
        /// 使用Linq的Distinct()方法去重
        /// </summary>
        [Benchmark]
        public void DistinctDuplicate()
        {
            var uniqueData = dataSource.Distinct().ToList();
        }

        /// <summary>
        /// 使用Linq的GroupBy()方法去重
        /// </summary>
        [Benchmark]
        public void GroupByDuplicate()
        {
            //GroupBy()方法將原始集合中的元素進(jìn)行分組,根據(jù)指定的鍵或條件進(jìn)行分組。每個分組都會有一個唯一的鍵,通過將原始集合分組并選擇每個分組中的第一個元素,實(shí)現(xiàn)了去重的效果。
            var uniqueData = dataSource.GroupBy(item => item).Select(group => group.First()).ToList();
        }

        /// <summary>
        /// 使用自定義的比較器和循環(huán)遍歷
        /// </summary>
        [Benchmark]
        public void CustomEqualityComparerDuplicate()
        {
            var uniqueData = new List<int>();
            foreach (var item in dataSource)
            {
                if (!uniqueData.Contains(item, new CustomEqualityComparer()))
                {
                    uniqueData.Add(item);
                }
            }
        }

        /// <summary>
        /// 自定義的比較器
        /// </summary>
        public class CustomEqualityComparer : IEqualityComparer<int>
        {
            public bool Equals(int x, int y)
            {
                return x == y;
            }

            public int GetHashCode(int obj)
            {
                return obj.GetHashCode();
            }
        }
    }
}

分析生成的報(bào)告

MethodMeanErrorStdDevGen0Gen1Gen2Allocated
HashSetDuplicate7.043 ms0.0546 ms0.0511 ms343.7500343.7500343.750018169.63 KB
LoopTraversalDuplicate7.385 ms0.0309 ms0.0274 ms---1.16 KB
DistinctDuplicate7.034 ms0.0497 ms0.0465 ms343.7500343.7500343.750018170.1 KB
GroupByDuplicate12.685 ms0.1025 ms0.0958 ms2265.62501781.2500515.625012843.65 KB
CustomEqualityComparerDuplicate25.608 ms0.1826 ms0.1708 ms3812.5000--23438.68 KB

說明:

  • Mean: 所有測量值的算術(shù)平均值。
  • Error: 99.9% 置信區(qū)間的一半。
  • StdDev: 所有測量值的標(biāo)準(zhǔn)差。
  • Gen0: 第 0 代 GC 每 1000 次操作收集一次。
  • Gen1: 第 1 代 GC 每 1000 次操作收集一次。
  • Gen2: 第 2 代 GC 每 1000 次操作收集一次。
  • Allocated: 每次操作分配的內(nèi)存(僅托管內(nèi)存,包含所有內(nèi)容,1KB = 1024B)。
  • 1 ms: 1 毫秒(0.001 秒)。

以上就是C#集合數(shù)據(jù)去重的5種方式及對比分析的詳細(xì)內(nèi)容,更多關(guān)于C#集合數(shù)據(jù)去重的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#的鋸齒數(shù)組以及C++實(shí)現(xiàn)代碼

    C#的鋸齒數(shù)組以及C++實(shí)現(xiàn)代碼

    鋸齒數(shù)組首先是二維數(shù)組,第一維的維數(shù)是確定的。之所以在C#中能夠出現(xiàn)靈活的鋸齒數(shù)組,是因?yàn)椋珻#的數(shù)組是引用類型(本質(zhì)上存放的是指針)。根據(jù)這個引用類型(指針)的概念,C++中用指針數(shù)組同樣可以實(shí)現(xiàn)
    2013-09-09
  • C#中Linq查詢基本操作使用實(shí)例

    C#中Linq查詢基本操作使用實(shí)例

    這篇文章主要介紹了C#中Linq查詢基本操作使用實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • c#中(&&,||)與(&,|)的區(qū)別詳解

    c#中(&&,||)與(&,|)的區(qū)別詳解

    這篇文章主要介紹了c#中(&&,||)與(&,|)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • c# base64轉(zhuǎn)字符串實(shí)例

    c# base64轉(zhuǎn)字符串實(shí)例

    這篇文章主要介紹了c# base64轉(zhuǎn)字符串實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • winform異型不規(guī)則界面設(shè)計(jì)的實(shí)現(xiàn)方法

    winform異型不規(guī)則界面設(shè)計(jì)的實(shí)現(xiàn)方法

    這篇文章主要介紹了winform異型不規(guī)則界面設(shè)計(jì)的實(shí)現(xiàn)方法,具有不錯的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C#輕松實(shí)現(xiàn)增加和刪除PowerPoint幻燈片

    C#輕松實(shí)現(xiàn)增加和刪除PowerPoint幻燈片

    在批量生成報(bào)告、動態(tài)拼接演示文稿或自動化處理 PPT 模板時,通過代碼動態(tài)增刪幻燈片幾乎是繞不開的需求,本文將以免費(fèi)庫 Free Spire.Presentation for .NET 為例,提供一個可直接落地的技術(shù)方案,希望對大家有所幫助
    2026-05-05
  • C# ManualResetEvent用法詳解

    C# ManualResetEvent用法詳解

    這篇文章主要介紹了C# ManualResetEvent用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 深入多線程之:解析線程的交會(Thread Rendezvous)詳解

    深入多線程之:解析線程的交會(Thread Rendezvous)詳解

    本篇文章是對線程的交會(Thread Rendezvous)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c# 靜態(tài)類的使用場景

    c# 靜態(tài)類的使用場景

    這篇文章主要介紹了c# 靜態(tài)類的使用場景,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • C#中怎么將一個List轉(zhuǎn)換為只讀的

    C#中怎么將一個List轉(zhuǎn)換為只讀的

    以下是對C#中將一個List轉(zhuǎn)換為只讀的實(shí)現(xiàn)方法進(jìn)行了介紹,需要的朋友可以過來參考下
    2013-08-08

最新評論

无极县| 上蔡县| 株洲县| 乌什县| 古田县| 周至县| 二连浩特市| 清流县| 普格县| 盐源县| 长沙市| 鹿邑县| 婺源县| 达州市| 且末县| 万山特区| 延吉市| 郸城县| 高淳县| 济南市| 余干县| 大埔区| 民丰县| 淮北市| 维西| 沾益县| 宁津县| 平度市| 红原县| 宜黄县| 乌苏市| 苍山县| 渭源县| 建瓯市| 沁源县| 襄樊市| 阿坝县| 庆城县| 刚察县| 本溪| 建昌县|