星期五, 4月 28, 2017

[LINQ] Except

使用 LINQ Except 時發現到,為什麼都沒有作用,後來查 MSDN 才晃然大悟,自訂的 class 要指定 IEqualityComparer,Except 才知道要怎麼進行資料篩選,寫個簡易範例紀錄
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var demoData1 = new List<Employ>()
            {
                new Employ() { EmpNO = "0001" , EmpName = "張三"},
                new Employ() { EmpNO = "0002" , EmpName = "李四"},
                new Employ() { EmpNO = "0003" , EmpName = "王五"}
            };

            var demoData2 = new List<Employ>()
            {
                new Employ() { EmpNO = "0001" , EmpName = "張三"},
            };

            Console.WriteLine("沒有指定 IEqualityComparer 結果");
            var result1 = demoData1.Except(demoData2);
            ShowData(result1);

            Console.WriteLine("指定 IEqualityComparer 結果");
            var result2 = demoData1.Except(demoData2,new EmployComparer());
            ShowData(result2);
        }

        private static void ShowData( IEnumerable<Employ> datas)
        {
            foreach (var e in datas)
            {
                Console.WriteLine($"           {e.EmpNO}-{e.EmpName}");
            }
        }
    }

    class Employ
    {
        public string EmpNO { get; set; }
        public string EmpName { get; set; }
    }

    class EmployComparer : IEqualityComparer<Employ>
    {
        public bool Equals(Employ x, Employ y)
        {
            //Check whether the compared objects reference the same data.
            if (Object.ReferenceEquals(x, y)) return true;

            //Check whether any of the compared objects is null.
            if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
                return false;

            //Check whether the Employ' properties are equal.
            return x.EmpNO == y.EmpNO && x.EmpName == y.EmpName;
        }

        public int GetHashCode(Employ e)
        {
            //Check whether the object is null
            if (Object.ReferenceEquals(e, null)) return 0;

            //Get hash code for the EmpNO field.
            int hashEmpNO = e.EmpNO == null ? 0 : e.EmpNO.GetHashCode();

            //Get hash code for the EmpName field.
            int hashEmpName = e.EmpName == null ?  0 : e.EmpName.GetHashCode();

            //Calculate the hash code for the Employ.
            return hashEmpNO ^ hashEmpName;
        }
    }
}
[LINQ] Except

星期四, 4月 27, 2017

[VS] 工作清單優先順序

工作清單是 VS 內的好用功能之一,只要在註解前加上設定關鍵字,EX:TODO,就可以在工作清單視窗內出現該註解

[VS] 工作清單優先順序-1

最近因為同時使用到兩種關鍵字,內建篩選功能是根據優先順序來篩選,沒有可以根據關鍵字的篩選方式,那就只能直接透過調整關鍵字的優先順序來達到篩選目標,調整 UNDONE 優先順序來說明

[VS] 工作清單優先順序-2

把 UNDONE 優先順序調低後,請不要去按 "確定" 按鈕,要先去按下圖的 "變更" 按鈕,才算是設定完成,Orz

[VS] 工作清單優先順序-3

設定完成後,在 UNDONE 關鍵字前,會出現一個往下符號,表示優先順序是低

[VS] 工作清單優先順序-4

在回到 VS 內就可透過篩選功能來只顯示 TODO 內容

[VS] 工作清單優先順序-5

星期五, 4月 21, 2017

[Win10] 啟動資料夾

在 Win10 上要把自行撰寫的程式,放在啟動資料夾,希望一開機就執行

在執行內輸入 shell:startup 就可以叫出啟動資料夾

[Win10] 啟動資料夾-1

星期四, 4月 20, 2017

GodexRT730X - 撕紙位置

新買一台標籤機 - GodexRT730X,安裝測試時就發現到,為什麼必須開啟機器才有辦法撕紙阿,Orz

下圖紅線是正常撕紙位置,綠線是 8x5 紙張,張和張之間的撕線

GodexRX730X-1

透過 NetSetting 軟體,把 Tear-off Position 設定,從預設 12 改為 16,這樣才能不需要打開機器並把紙張撕下來,上圖綠線位置接近紅色位置

GodexRX730X-2
  • 20180910
公司又買了一台同型號標籤機,同事安裝時發現沒有 NetSetting 軟體,他是用 GoLabel 軟體進行設定,截圖紀錄一下

GodexRX730X-3

星期三, 4月 19, 2017

[LINQ] OrderBy - 隨機排序

實務上有該需求,在 TSQL 是利用 ORDER BY NEWID() 來達到需求,C# 內則是透過 Random 來做到
namespace LINQRandom
{
    class Program
    {
        static void Main(string[] args)
        {
            Random r = new Random(Guid.NewGuid().GetHashCode());

            var result = Enumerable.Range(0, 10).OrderBy(o => r.Next());

            foreach (var item in result)
            {
                Console.WriteLine(item);
            }
        }
    }
}
[LINQ] 隨機排序

星期一, 4月 17, 2017

GodexG530 - 停止位置

廠商來公司,就順道聊一下,對方建議調整紙張停止位置,可以幫助列印後,撕紙更加流暢,也比較不容易毀損到其他標籤紙,以前都直接用機器預設,使用者也從來沒有反應過該問題,就筆記一下囉

GodexG530-停止位置

星期六, 4月 15, 2017

[C#] 星期中文說明

在 VS 2017 上要把 DayOfWeek 轉成星期中文說明時,發現 ToString() 的兩種做法 DayOfWeek.ToString(IFormatProvider provider) 和 DayOfWeek.ToString(string format , IFormatProvider provider) 都已經 GG 了

[C#] 星期中文說明

利用 DateTimeFormat 來進行轉換

using System.Globalization;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            CultureInfo ci = new CultureInfo("zh-tw");
            // 20230612 補上 Calendar 設定
            ci.DateTimeFormat.Calendar = new TaiwanCalendar();            
            string DWShortName = ci.DateTimeFormat.GetShortestDayName(DateTime.Today.DayOfWeek);
            string DWName = ci.DateTimeFormat.GetDayName(DateTime.Today.DayOfWeek);
            Console.WriteLine($"今天:{DateTime.Today.ToString("yyyy/MM/dd")}-{DWShortName}-{DWName}");
        }
    }
}
[C#] 星期中文說明-2

星期三, 4月 12, 2017

[Skype] 需等待對方接受要求後才能傳訊息

使用者回報,為什麼今天 Skype 有異常,對方可以傳訊息過來,但是無法傳訊息過去,而且還有對方要接收要求才能傳訊息字樣

[Skype] 需等待對方接受要求後才能傳訊息

嘗試重新安裝 Skype 或重新加入聯絡人都沒有解決該問題,在 Skype 社群找到這篇討論,依據步驟有成功解決該問題
  1. 在工作管理員裡面結束所有 Skype.exe 服務
  2. 在 Windows 搜索框裡面輸入 %appdata%,按 Enter,找到 Skype 資料夾,另外命名為其他名稱,例如:Skype_old
  3. 在 Windows 搜索框裡面輸入 %temp%\skype,按 Enter,刪除 DbTemp 資料夾
  4. 重啟 Skype
  • 20170621 該問題在某台 PC 上又出現,是依該文章處理,忘記檢查是否有新版 Skype,>.<
  • 參考資料
  • Skype 社群討論

星期二, 4月 11, 2017

[C#] 循環相依

之前曾有一次 dll 參考出現問題,就把 Solution 內全部 Project 產生的 dll 刪除,刪除完才發現,全部 Project 就沒有辦法 build,當時 code 放在雲端空間,所以就把刪除的 dll 回復就正常,當時也沒有想太多,這次模擬把 code 放上 VSTS 後,在另一台 PC 上拉下來,又發現 project 沒辦法 build,才意識到嚴重性,從 VSTS 上抓下來沒有辦法 build,這樣要如何多人協同開發阿,Orz

閱讀該篇 MSDN 文章 - 管理專案中的參考 後,才發現原來參考 dll 的方式是錯誤的,一直以來都是用[檔案參考],應該使用[專案對專案參考] 才對

參考管理員
  • 紅框:專案對專案參考
  • 橘框:檔案參考
專案對專案參考 MSDN 說明
專案對專案參考是包含組件的專案參考;您可以使用 [專案] 索引標籤建立專案對專案參考。 當給定專案路徑時,Visual Studio 即可找出組件。

當您有會產生組件的專案時,您應該參考該專案,而不要使用檔案參考 (請參閱下文)。 專案對專案參考的優點是它會在組建系統中建立專案之間的相依性。 如果自上次建置的參考專案已變更,則將會建立相依專案。 檔案參考不會建立組建相依性,因此可以建置參考專案而不需建置相依專案,且參考可能會遭到淘汰。 (也就是專案可以參考先前建置的專案版本。) 這會導致在 bin 目錄中需要單一 DLL 的數個版本,但這不可能達成。 發生這個衝突時,您會看到類似 警告: 無法將專案 'project' 中的相依性 'file' 複製至執行目錄,因為它會覆寫參考 'file' 的訊息

如果某個專案的 .NET Framework 目標版本為 4.5 版,而其他專案的目標版本為第 2 版、第 3 版、3.5 版或 4.0 版,則會建立檔案參考而非專案對專案參考。
檔案參考 MSDN 說明
檔案參考是 Visual Studio 專案內容外部之組件的直接參考;您可以使用 [參考管理員] 的 [瀏覽] 索引標籤建立檔案參考。 當您只有組件或元件,而且不需要會建立檔案參考做為輸出的專案時,請使用檔案參考。
把參考方式改為 [專案對專案參考],就跳出錯誤訊息,看到關鍵字 - 循環相依,終於知道犯了甚麼錯誤,>.<
循環相依 MSDN 說明
錯誤訊息中參考的專案,必須相依於選取的專案才能建置;選取的專案要相依於所參考的專案才能建置。必須解析循環參考,才能建置這兩個專案。

通常是在一個部署專案包含第二個部署專案的專案輸出,而第二個專案又包含第一個專案的輸出時,才會發生這種錯誤。
把 Code 重新整理後,在模擬一次就 OK

星期四, 4月 06, 2017

Visual Studio 貼紙

參加研討會免費索取的贈品

Visual Studio 貼紙