主頁 > 軟體工程 > 試圖洗掉一個空列-winform

試圖洗掉一個空列-winform

2022-05-23 22:59:41 軟體工程

我在 winform 中創建了一個小專案來顯示來自 mhtml 檔案的資料網格視圖。一切正常。我想在我的專案中添加一些內容:當我看到一個空列時,如果有的話,我想將其洗掉。我幾乎做到了,但我有一個錯誤。
這是代碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MHtmlTablesHunter
{
    public partial class Form1 : Form
    {
        private readonly string ConvertedFileName = "page.html";

        private readonly List<string> ColumnsToSeparate = new List<string>() { "life limit", "interval" }; // Delete these columns 

        private readonly List<string> ExtraColumnsToAdd = new List<string>() { "Calendar", "Flight Hours", "Landing" }; // Add these columns
        public Form1()
        {
            InitializeComponent();
            this.Text = $"MhtmlTablesHunter v{Application.ProductVersion}";

        }

        //browse for specific file type , in this case its .mhtml
        private void btnBrowse_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                openFileDialog.Title = "Please choose the MHTML file";
                openFileDialog.Filter = "MHTML files (*.mhtml)|*.mhtml;";  //the file type specified here
                openFileDialog.RestoreDirectory = false;

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    textBoxSourceFile.Text = openFileDialog.FileName;
                    checkAndExtractTable();
                }
            }

        }

        private void checkAndExtractTable()
        {
            string sourcePath =   textBoxSourceFile.Text;
            if (!string.IsNullOrEmpty(sourcePath)) //check if the input file path is not empty
            {
                if (File.Exists(sourcePath)) //check if the input file path is exists
                {
                    Task.Run(async () => await ExtractTable(sourcePath)); //run the extraction process in a thread for the UI to be more responsive
                }
                else
                {
                    MessageBox.Show("Source file doesn't exist.");
                }
            }
            else
            {
                MessageBox.Show("Please select the source file.");
            }
        }
        //This part concern the headers, rows and columns
        public async Task<string> ExtractTable(string sourcePath)
        {
            try
            {
                var doc = new HtmlAgilityPack.HtmlDocument();

                var converter = new MimeConverter(); //converter used to convert mhtml file to html

                if (File.Exists(ConvertedFileName))  //check if previously converted file is exist
                {
                    File.Delete(ConvertedFileName);  //delete the file
                }
                using (FileStream sourceStream = File.OpenRead(sourcePath))
                {
                    using (FileStream destinationStream = File.Open("page.html", FileMode.Create))
                    {
                        await converter.Convert(sourceStream, destinationStream);  //convert the file to html, it will be stored in the application folder
                    }
                }

                doc.Load(ConvertedFileName);  //load the html
                //var tables = doc.GetElementbyId("d19924139e528_grid"); //get the 7th table by its id, we can get the table id by inspecting element in the internet explorer
                var tables = doc.DocumentNode.SelectNodes("//table"); //get all the tables
                HtmlAgilityPack.HtmlNode table = null;


                if (tables.Count > 0)
                {
                    table = tables[tables.Count - 1]; //take the last table
                }


                if (table != null) //if the table exists
                {
                    dataGridView1.Invoke((Action)delegate //we use delegate because we accessing the datagridview from a different thread
                    {
                        this.dataGridView1.Rows.Clear();
                        this.dataGridView1.Columns.Clear();
                    });

                    var rows = table.SelectNodes(".//tr"); //get all the rows

                    var nodes = rows[0].SelectNodes("th|td"); //get the header row values, first item will be the header row always
                    string LifeLimitColumnName = ColumnsToSeparate.Where(c => nodes.Any(n => n.InnerText.ToLower().Contains(c))).FirstOrDefault();
                    if (string.IsNullOrWhiteSpace(LifeLimitColumnName))
                    {
                        LifeLimitColumnName = "Someunknowncolumn";
                    }
                    List<string> headers = new List<string>();
                    for (int i = 0; i < nodes.Count; i  ) // LOOP
                    {
                        headers.Add(nodes[i].InnerText);
                        if (!nodes[i].InnerText.ToLower().Contains(LifeLimitColumnName))
                        {
                            dataGridView1.Invoke((Action)delegate
                            {
                                dataGridView1.Columns.Add("", nodes[i].InnerText);
                            });
                        }
                    }

                    int indexOfLifeLimitColumn = headers.FindIndex(h => h.ToLower().Contains(LifeLimitColumnName));
                    if (indexOfLifeLimitColumn > -1)
                    {
                        foreach (var eh in ExtraColumnsToAdd)
                        {
                            dataGridView1.Invoke((Action)delegate
                            {
                                dataGridView1.Columns.Add("", eh); //add extra header to the datagridview
                            });

                        }
                    }

                    int[] rowDataCount = new int[dataGridView1.Columns.Count];
                    Array.Clear(rowDataCount, 0, rowDataCount.Length);

                    for (int i = 1; i < rows.Count; i  ) ///loop through rest of the rows
                    {
                        var row = rows[i];
                        var nodes2 = row.SelectNodes("th|td"); //get all columns in the current row
                        List<string> values = new List<string>(); //list to store row values
                        for (int x = 0; x < nodes2.Count; x  )
                        {
                            //rowes.Cells[x].Value = nodes2[x].InnerText;
                            string cellText = nodes2[x].InnerText.Replace("&nbsp;", " ");
                            if (!String.IsNullOrWhiteSpace(cellText)) {
                                rowDataCount[x]  ;
                            }
                            values.Add(cellText); //add the cell value in the list

                        }
                        // Factory for -> Calendar, Flight Hours, Landings
                        if (indexOfLifeLimitColumn > -1)
                        {
                            values.RemoveAt(indexOfLifeLimitColumn);
                            string lifeLimitValue = nodes2[indexOfLifeLimitColumn].InnerText.Replace("&nbsp;", " ");
                            string[] splittedValues = lifeLimitValue.Split(' ');
                            for (int y = 0; y < ExtraColumnsToAdd.Count; y  )
                            {
                                if (ExtraColumnsToAdd[y] == "Calendar")
                                {
                                    string valueToAdd = string.Empty;
                                    string[] times = new string[] { "Years", "Year", "Months", "Month", "Day", "Days" };
                                    if (splittedValues.Any(s => times.Any(t => t == s)))
                                    {
                                        var timeFound = times.Where(t => splittedValues.Any(s => s == t)).FirstOrDefault();
                                        int index = splittedValues.ToList().FindIndex(s => s.Equals(timeFound));
                                        valueToAdd = $"{splittedValues[index - 1]} {timeFound}";
                                    }
                                    values.Add(valueToAdd);
                                }
                                else if (ExtraColumnsToAdd[y] == "Flight Hours")
                                {
                                    string valueToAdd = string.Empty;
                                    if (splittedValues.Any(s => s == "FH"))
                                    {
                                        int index = splittedValues.ToList().FindIndex(s => s.Equals("FH"));
                                        valueToAdd = $"{splittedValues[index - 1]} FH";
                                    }
                                    values.Add(valueToAdd);
                                }
                                else
                                {
                                    string valueToAdd = string.Empty;
                                    if (splittedValues.Any(s => s == "LDG"))
                                    {
                                        int index = splittedValues.ToList().FindIndex(s => s.Equals("LDG"));
                                        valueToAdd = $"{splittedValues[index - 1]} LDG";
                                    }
                                    values.Add(valueToAdd);
                                }
                            }
                        }

                        dataGridView1.Invoke((Action)delegate
                        {
                            this.dataGridView1.Rows.Add(values.ToArray()); //add the list as a row
                        });

                        int removedCount = 0;
                        for (int index = 0; index < rowDataCount.Length; index  ) {
                            if (rowDataCount[index] == 0) {
                                dataGridView1.Invoke((Action)delegate
                                {
                                    this.dataGridView1.Columns.RemoveAt(index - removedCount);
                                    removedCount  ;
                                });
                            }
                        }


                    }

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return string.Empty;
        }

        private void textBoxSourceFile_TextChanged(object sender, EventArgs e)
        {

        }

    }
}

這是winform專案的設計代碼

{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
            this.textBoxSourceFile = new System.Windows.Forms.TextBox();
            this.btnBrowse = new System.Windows.Forms.Button();
            this.dataGridView1 = new System.Windows.Forms.DataGridView();
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
            this.SuspendLayout();
            // 
            // textBoxSourceFile
            // 
            this.textBoxSourceFile.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.textBoxSourceFile.Location = new System.Drawing.Point(51, 38);
            this.textBoxSourceFile.Margin = new System.Windows.Forms.Padding(4);
            this.textBoxSourceFile.Name = "textBoxSourceFile";
            this.textBoxSourceFile.Size = new System.Drawing.Size(903, 30);
            this.textBoxSourceFile.TabIndex = 0;
            // 
            // btnBrowse
            // 
            this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
            this.btnBrowse.Location = new System.Drawing.Point(999, 38);
            this.btnBrowse.Margin = new System.Windows.Forms.Padding(4);
            this.btnBrowse.Name = "btnBrowse";
            this.btnBrowse.Size = new System.Drawing.Size(93, 28);
            this.btnBrowse.TabIndex = 1;
            this.btnBrowse.Text = "Browse";
            this.btnBrowse.UseVisualStyleBackColor = true;
            this.btnBrowse.Click  = new System.EventHandler(this.btnBrowse_Click);
            // 
            // dataGridView1
            // 
            this.dataGridView1.AllowUserToAddRows = false;
            this.dataGridView1.AllowUserToDeleteRows = false;
            this.dataGridView1.AllowUserToResizeRows = false;
            this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
            | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
            this.dataGridView1.BackgroundColor = System.Drawing.SystemColors.ControlLight;
            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dataGridView1.Location = new System.Drawing.Point(51, 118);
            this.dataGridView1.Margin = new System.Windows.Forms.Padding(4);
            this.dataGridView1.Name = "dataGridView1";
            this.dataGridView1.RowHeadersVisible = false;
            this.dataGridView1.RowHeadersWidth = 62;
            this.dataGridView1.Size = new System.Drawing.Size(1042, 467);
            this.dataGridView1.TabIndex = 2;
            //this.dataGridView1.CellContentClick  = new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellContentClick);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(1136, 636);
            this.Controls.Add(this.dataGridView1);
            this.Controls.Add(this.btnBrowse);
            this.Controls.Add(this.textBoxSourceFile);
            this.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.Margin = new System.Windows.Forms.Padding(4);
            this.MinimumSize = new System.Drawing.Size(1086, 557);
            this.Name = "Form1";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "Form1";
            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.TextBox textBoxSourceFile;
        private System.Windows.Forms.Button btnBrowse;
        private System.Windows.Forms.DataGridView dataGridView1;
    }
}

當我運行它時,我有這個錯誤

點擊這里查看圖片

uj5u.com熱心網友回復:

可能您的陣列中的列多于網格 - 在您宣告陣列后,我看不到任何洗掉列的內容,但也許最好將洗掉列與實際網格列是否有資料結合起來而不是你是否在其中放入任何資料的記憶。讓我們詢問網格“對于每一列,該列的所有行都沒有值嗎?洗掉列”:

dataGridView1.Invoke((Action)delegate
{
    var rowNumerable = dataGridView1.Rows.Cast<DataGridViewRow>();

    for (int i = dataGridView1.Columns.Count - 1; i >= 0; i--)
    {
        if (rowNumerable.All(r => string.IsNullOrEmpty(r.Cells[i].Value?.ToString())))
            dataGridView1.Columns.RemoveAt(i);
    }
});

旁注,我的列洗掉回圈相反運行,因為這意味著洗掉列索引i只會影響列> i,但我們已經處理了它們。它不會影響我們尚未處理的列索引的索引,< i因此我們不需要弄亂索引。

TLDR:如果您要從正在回圈的集合中洗掉東西,反向回圈可以使事情變得更簡單

uj5u.com熱心網友回復:

最后我做到了,非常感謝大家。凱厄斯杰德你是對的。我聽從你的指示。它現在正在作業。這是代碼:

                    dataGridView1.Invoke((Action)delegate
                    {
                        int[] rowDataCount = new int[dataGridView1.Columns.Count];
                        Array.Clear(rowDataCount, 0, rowDataCount.Length);

                        for (int row_i = 0; row_i < this.dataGridView1.RowCount; row_i  )
                        {
                            for (int col_i = 0; col_i < this.dataGridView1.ColumnCount; col_i  )
                            {
                                var cell = this.dataGridView1.Rows[row_i].Cells[col_i];
                                string cellText = cell.Value.ToString();
                                if (!String.IsNullOrWhiteSpace(cellText))
                                {
                                    rowDataCount[col_i]  = 1;
                                }
                            }
                        }

                        int removedCount = 0;
                        for (int index = 0; index < rowDataCount.Length; index  )
                        {
                            if (rowDataCount[index] == 0)
                            {
                                this.dataGridView1.Columns.RemoveAt(index - removedCount);
                                removedCount  ;
                            }
                        }
                    });
                }
            }```

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/480223.html

標籤:C# 形式 视觉工作室 表格

上一篇:如何在Unity中啟用粒子系統的碰撞?

下一篇:SSAS表格DISTINCTCOUNTNOBLANK等效項

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more