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

使用C#從零到完整實現(xiàn)的并發(fā)單詞頻率統(tǒng)計器

 更新時間:2026年06月04日 09:25:20   作者:freedom ?  
在工業(yè)自動化中,經(jīng)常需要處理日志文件、設備數(shù)據(jù)記錄,并統(tǒng)計關(guān)鍵字出現(xiàn)頻率,所以本文給大家使用C#從零到完整實現(xiàn)了一個并發(fā)單詞頻率統(tǒng)計器,需要的朋友可以參考下

一、項目背景與目標

在工業(yè)自動化中,經(jīng)常需要處理日志文件、設備數(shù)據(jù)記錄,并統(tǒng)計關(guān)鍵字出現(xiàn)頻率。本項目的目標是:

  • 批量并發(fā)創(chuàng)建文本文件(支持用戶指定多個文件名)
  • 交互式追加內(nèi)容(逐個詢問是否寫入英文句子)
  • 統(tǒng)計所有文件的單詞頻率(支持按文件、按單詞查詢)
  • 用戶交互查詢(輸入文件名和單詞,返回出現(xiàn)次數(shù))

通過這個項目,熟悉 C# 異步編程、LINQ、正則表達式、字典操作等核心技能。

二、核心代碼與語法解析

2.1 異步創(chuàng)建文件(并發(fā))

使用 Task.WhenAll 并發(fā)創(chuàng)建多個文件,提高效率。

private static async Task<List<string>> createTxt()
{
    // 確保目錄存在
    if (!Directory.Exists(DEFAULT_PATH))
        Directory.CreateDirectory(DEFAULT_PATH);

    while (true)
    {
        Console.Write("Please input text type as you want, you can input more:>>>");
        string? input = Console.ReadLine();
        if (string.IsNullOrWhiteSpace(input)) continue;

        string[] filesName = input.Split(',', StringSplitOptions.RemoveEmptyEntries)
                                  .Select(s => s.Trim())
                                  .ToArray();
        var textList = new List<Task<string>>();

        foreach (string text in filesName)
        {
            if (!parityText(text)) continue;               // 文件名校驗
            if (File.Exists(Path.Combine(DEFAULT_PATH, text)))
            {
                Console.WriteLine("File is Existing");
                continue;
            }
            textList.Add(createAsyncFile(text));           // 每個文件一個異步任務
        }

        if (textList.Count == 0) continue;

        string[] files = await Task.WhenAll(textList);     // 并發(fā)等待所有文件創(chuàng)建完成
        List<string> fileList = files.Where(f => f != null)
                                     .Select(f => Path.Combine(DEFAULT_PATH, f))
                                     .ToList();
        Console.WriteLine($"所有文件創(chuàng)建完成,共 {textList.Count} 個。");
        return fileList;
    }
}

private static async Task<string> createAsyncFile(string text)
{
    try
    {
        string default_content = $"http:// Created:{DateTime.Now:yyyy-MM-dd HH:mm:ss} \n// Author: Dong Wang  ";
        await File.WriteAllTextAsync(Path.Combine(DEFAULT_PATH, text), default_content);
        lock (_lock) Console.WriteLine($"Created successfully!!!! File Name:{text}");
        return text;
    }
    catch (Exception ex)
    {
        lock (_lock) Console.WriteLine($"{ex.Message}");
        return null;
    }
}

語法點:

  • async Task<string> 表示異步方法,返回 string。
  • await Task.WhenAll(textList) 等待所有任務完成。
  • lock (_lock) 保證控制臺輸出不混亂。

2.2 正則分割單詞(統(tǒng)計詞頻)

private static Dictionary<string, int> GetTextsFromFile(string fileReal)
{
    string text = File.ReadAllText(Path.Combine(DEFAULT_PATH, fileReal)).ToLower();
    // 按非單詞字符分割(空格、標點、換行等)
    string[] words = Regex.Split(text, @"\W+");
    var wordCount = new Dictionary<string, int>();
    foreach (string w in words)
    {
        if (string.IsNullOrEmpty(w)) continue;
        string word = w.ToLower();
        if (wordCount.ContainsKey(word))
            wordCount[word]++;
        else
            wordCount[word] = 1;
    }
    return wordCount;
}

關(guān)鍵正則: \W+ 匹配一個或多個非單詞字符,相當于分割符。

2.3 并發(fā)統(tǒng)計所有文件(使用元組返回文件名和結(jié)果)

var tasks = filesReal.Select(async filePath =>
{
    var wordCount = await Task.Run(() => GetTextsFromFile(filePath));
    return (FileName: Path.GetFileName(filePath), WordCount: wordCount);
});
var results = await Task.WhenAll(tasks);
var textWords = results.ToDictionary(r => r.FileName, r => r.WordCount);
  • 每個任務返回元組 (string FileName, Dictionary<string,int> WordCount)
  • Task.WhenAll 等待所有文件統(tǒng)計完畢,返回數(shù)組。
  • 使用 ToDictionary 快速構(gòu)建嵌套字典。

2.4 忽略文件名大小寫的字典

Dictionary<string, Dictionary<string, int>> textWords = 
    new Dictionary<string, Dictionary<string, int>>(StringComparer.OrdinalIgnoreCase);

這樣用戶輸入 "HAHA.TXT""haha.txt" 都能匹配。

2.5 用戶交互查詢

private static void UserInputQueryWord(string v, Dictionary<string, Dictionary<string, int>> textwords)
{
    while (true)
    {
        Console.Write("Please input query word:>>");
        string? input = Console.ReadLine();
        if (input == null) continue;
        input = input.ToLower();
        string[] words = SplitWord(input);
        foreach (string word in words)
        {
            if (textwords.TryGetValue(v, out var wordCount) &&
                wordCount.TryGetValue(word, out int count))
            {
                Console.WriteLine($"該文件 {v} 中的搜索詞 {word} 查詢出現(xiàn)的頻率: {count} 次");
            }
            else
            {
                Console.WriteLine($"該文件 {v} 中的搜索詞 {word} 未找到");
            }
        }
        break;
    }
}
  • TryGetValue 安全獲取嵌套字典的值。
  • 單詞統(tǒng)一轉(zhuǎn)為小寫,保證統(tǒng)計一致性。

三、遇到的問題與解決方案

問題描述原因解決方案
正則分割后得到很多標點符號誤用 \w+ 作為分隔符改為 \W+(大寫 W)
并發(fā)輸出控制臺內(nèi)容混亂多個線程同時調(diào)用 Console.WriteLine使用 lock 同步
文件名大小寫導致查詢失敗默認字典區(qū)分大小寫構(gòu)造函數(shù)傳入 StringComparer.OrdinalIgnoreCase
Task.WhenAll 返回數(shù)組無法直接轉(zhuǎn)換成嵌套字典任務只返回字典,丟失文件名任務返回元組 (FileName, WordCount)
并發(fā)統(tǒng)計時重復創(chuàng)建任務在循環(huán)內(nèi)執(zhí)行 Select一次性創(chuàng)建所有任務,再 WhenAll

四、運行示例

Please input text type as you want, you can input more:>>>a.txt, b.txt
Created successfully!!!! File Name:a.txt
Created successfully!!!! File Name:b.txt
所有文件創(chuàng)建完成,共 2 個。
是否需要為該文件:...\a.txt,寫入內(nèi)容?Y/N:>>y
請輸入你要往...\a.txt 文件傳輸?shù)膬?nèi)容:>>hello world hello C# is powerful
文件...\a.txt,成功被寫入
是否需要為該文件:...\b.txt,寫入內(nèi)容?Y/N:>>n
用戶不進行寫入,該文件:...\b.txt
Please input the specify file:>a.txt
1 words
文件名:a.txt
Please input query word:>>hello
該文件 a.txt 中的搜索詞 hello 查詢出現(xiàn)的頻率: 2 次
是否退出?(Y/N)::>>y
CreateTxt Method is Done

五、可以繼續(xù)優(yōu)化的方向

  • 支持空格分隔文件名:修改 SplitWord 同時支持逗號和空格。
  • 過濾停用詞(如 a, an, the, and, of 等)。
  • 導出統(tǒng)計報告到文件(使用 StreamWriter)。
  • 增加全局詞頻統(tǒng)計(合并所有文件,顯示 Top N)。
  • 進度提示:在并發(fā)統(tǒng)計時顯示當前處理進度。
  • 處理大文件:改用 StreamReader 逐行讀取。
  • 配置文件支持:將文件夾路徑、停用詞表等放到 appsettings.json。

六、總結(jié)

通過本項目,我掌握了以下 C# 核心技術(shù):

  • 異步編程(async/awaitTask、Task.WhenAll
  • 并發(fā)控制(lock、線程安全)
  • 正則表達式(Regex.Split、單詞分割)
  • 文件 I/O(異步讀寫、目錄操作)
  • 集合高級用法(嵌套字典、LINQ、元組)
  • 用戶交互(循環(huán)輸入、異常處理)

本項目可以作為學習上位機開發(fā)的起點,后續(xù)可以擴展為工業(yè)數(shù)據(jù)采集與監(jiān)控系統(tǒng)

以上就是使用C#從零到完整實現(xiàn)的并發(fā)單詞頻率統(tǒng)計器的詳細內(nèi)容,更多關(guān)于C#并發(fā)單詞頻率統(tǒng)計器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c# 如何實現(xiàn)自動更新程序

    c# 如何實現(xiàn)自動更新程序

    這篇文章主要介紹了如何用c# 自動更新程序,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#實現(xiàn)Markdown內(nèi)容轉(zhuǎn)為Word或PDF

    C#實現(xiàn)Markdown內(nèi)容轉(zhuǎn)為Word或PDF

    Markdown作為一種輕量級的標記語言,因其簡潔易讀、語法清晰的特點被廣大程序員和技術(shù)文檔編寫者所青睞,本文主要介紹了如何使用C#實現(xiàn)Markdown內(nèi)容轉(zhuǎn)為Word或PDF,需要的可以參考下
    2024-03-03
  • C# .net core HttpClientFactory用法及說明

    C# .net core HttpClientFactory用法及說明

    這篇文章主要介紹了C# .net core HttpClientFactory用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • C#中checked關(guān)鍵字的使用小結(jié)

    C#中checked關(guān)鍵字的使用小結(jié)

    本文主要介紹了C#中checked關(guān)鍵字的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-12-12
  • Unity實現(xiàn)ScrollView滑動吸附功能

    Unity實現(xiàn)ScrollView滑動吸附功能

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)ScrollView滑動吸附功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C#中基數(shù)排序算法的原理及實現(xiàn)

    C#中基數(shù)排序算法的原理及實現(xiàn)

    基數(shù)排序算法是一種非比較式的排序方法,通過分配和收集步驟對數(shù)字的每一位進行排序,學習基數(shù)排序有助于提高排序效率,解決特定問題,廣泛應用于多個領(lǐng)域如數(shù)據(jù)分析和數(shù)據(jù)庫索引建立等
    2024-10-10
  • C#代碼實現(xiàn)將HTML轉(zhuǎn)換為PDF、XPS和XML

    C#代碼實現(xiàn)將HTML轉(zhuǎn)換為PDF、XPS和XML

    HTML 是網(wǎng)頁和在線內(nèi)容的標準格式,但在許多場景中您可能需要將 HTML 文檔轉(zhuǎn)換為其他文件格式,下面我們就來看看如何使用 Spire.Doc for .NET 在 C# 中將 HTML 轉(zhuǎn)換為 PDF、XPS 和 XML吧
    2026-04-04
  • WPF實現(xiàn)授權(quán)碼顯示密文并支持換行

    WPF實現(xiàn)授權(quán)碼顯示密文并支持換行

    這篇文章主要為大家詳細介紹了如何使用WPF實現(xiàn)授權(quán)碼顯示密文并支持換行,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下
    2024-10-10
  • 使用C#實現(xiàn)讀取PDF中所有文本內(nèi)容

    使用C#實現(xiàn)讀取PDF中所有文本內(nèi)容

    這篇文章主要為大家詳細介紹了如何使用C#實現(xiàn)讀取PDF中所有文本內(nèi)容,文中的示例代碼簡潔易懂,具有一定的學習價值,有需要的小伙伴可以了解下
    2024-02-02
  • C#對JSON與對象的序列化與反序列化

    C#對JSON與對象的序列化與反序列化

    這篇文章介紹了C#對JSON與對象的序列化與反序列化,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論

富蕴县| 嘉荫县| 太原市| 东乡族自治县| 会宁县| 湘潭市| 怀集县| 新源县| 深水埗区| 宁河县| 西盟| 白河县| 革吉县| 陕西省| 城市| 堆龙德庆县| 平定县| 水城县| 苍山县| 香港 | 金堂县| 荆门市| 平遥县| 册亨县| 富锦市| 宾阳县| 新竹市| 阜宁县| 连平县| 四川省| 九龙城区| 金寨县| 定日县| 高邮市| 茶陵县| 峨山| 绥化市| 珲春市| 奉化市| 黄石市| 梅州市|