Archive


Category: 來玩C#

  • C#語法比較時間大小三種技巧

    C#語法比較時間大小三種技巧 資料來源: https://goo.gl/Y51zmD C#語法比較時間大小三種技巧 (一)比較時間大小的測試     string st1=”12:13″;      string st2=”14:14″;      DateTime dt1=Convert.ToDateTime(st1);      DateTime dt2=Convert.ToDateTime(st2);      if(DateTime.Compare(dt1,dt2)>0)     {         msg.Text=st1+”>”+st2;     }      else      {         msg.Text=st1+”<“+st2;     } (二)計算兩個時間差值的函數,傳回時間差的絕對值:      private string DateDiff(DateTime […]

  • [C#] EF性能優化

    使用EF的linq查詢之後,建議查看一下生成的sql語句. 只選擇某列或某些列 有些時候,在C#裡寫LINQ雖然看著舒服,但性能不一定好,所以有必要做一些調整。比如這種情況: 我需要知道一篇文章的點擊數,僅此而已,我可能會寫: context.Post.FirstOrDefault(p => p.Id == postId).Hits; 或者: context.Post.Find(postId).Hits; 我期待著他們只去資料庫裡篩選Hits這一列的資料,然而,通過SQL Profiler會發現,這兩條語句居然把全部列都給select出來了,訪問Hits的操作實際是在記憶體中進行的。 雖然小表看不出性能問題,但萬一你的表裡有一列是存檔位元組流(byte)的,那這樣的操作可能會很慢,並且消耗額外的網路傳輸,所以不能忽視這個問題。 其實,我只要稍作調整,就能避免這個問題,但會LINQ語句難看一點: context.Post.Where(p => p.Id == postId).Select(p => p.Hits).FirstOrDefault(); LINQ to SQL最終生成的native sql是這樣的: exec sp_executesql N’SELECT TOP (1)  [Extent1].[Hits] AS [Hits] FROM [dbo].[Post] AS [Extent1] WHERE [Extent1].[Id] = @p__linq__0′,N’@p__linq__0 uniqueidentifier’,@p__linq__0=’850C3A86-6C3D-408B-8099-61EDA559F804′ 真正的只select了Hits一個欄位。 ToList()的問題 其實EF很多時候的性能問題都是關係到查詢執行時機的。我們通常的意圖是,首先建立一個查詢運算式,只是build,而不execute。執行的時機是用到這個運算式結果的時候才去執行。 在公司碼程式的時候,我看到好多同事用EF,寫完查詢喜歡直接調用ToList()方法。有時候這會造成很大的性能問題。因為單純聲明一個linq運算式並不會立即執行SQL查詢,然而一旦在後面加上ToList(),就會立即去執行。如果你只是想根據條件選擇其中一些資料,而非全部的話,那ToList()以後再篩選,就是從記憶體裡執行了,並不是把你的條件轉換成sql的where語句去執行。 var query = from ….. // 建立查詢,但不執行 …  […]

  • [C#] 圖片檔讀取:非鎖定檔方法 [Image.FromFile 釋放]

    content from http://jashliao.pixnet.net/blog/post/223534989 FileStream fs = File.OpenRead(StrDestFilePath); //OpenRead[二進位讀檔] int filelength = 0; filelength = (int)fs.Length; //獲得檔長度 Byte[] image = new Byte[filelength]; //建立一個位元組陣列 fs.Read(image, 0, filelength); //按位元組流讀取 System.Drawing.Image result = System.Drawing.Image.FromStream(fs); fs.Close();  

  • [C#] C# 二進位陣列(檔案) 和 Base64字串 互轉

    content come from http://jashliao.pixnet.net/blog/post/223529346 using System; public class Example {    public static void Main()    {        // Define a byte array.        byte[] bytes = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };        Console.WriteLine(“The byte array: “);        Console.WriteLine(”   {0}\n”, […]

  • [C#] 浮點數四捨五入計算

    資料來自於 http://jashliao.pixnet.net/blog/post/223492905-c%23-%E6%B5%AE%E9%BB%9E%E6%95%B8%E5%9B%9B%E6%8D%A8%E4%BA%94%E5%85%A5-%5B-math.round-%5D-%E8%A8%88%E7%AE%97 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CS_Console_Round {     class Program     {         static void pause()         {             Console.Write(“Press any key to continue . . . “);             Console.ReadKey(true);         }         static void Main(string[] args)         {             //https://social.msdn.microsoft.com/Forums/zh-TW/a4017834-99b9-4bde-ad16-db1ff71a564a?forum=233             double A = 2;             double B […]

  • [C#] TCP允許多人連線SERVER和重複開啟的Client

    程式碼擷錄自jashliao痞客邦部落格 SERVER using System; using System.Threading; using System.Net.Sockets; using System.Text;   namespace csharp_multi_threaded_server_socket {     //資料來源 http://csharp.net-informations.com/communications/csharp-multi-threaded-server-socket.htm     class Program     {         static void Main(string[] args)         {             TcpListener serverSocket = new TcpListener(8888);             TcpClient clientSocket = default(TcpClient);             int counter = 0;               serverSocket.Start();             Console.WriteLine(” >> ” + “Server Started”); […]

  • [C#] HttpWebRequest 存取 WEB API 不要有Cache的寫法

     文章來自 http://jashliao.pixnet.net/blog/post/223322602-c%23-httpwebrequest-%E5%AD%98%E5%8F%96-web-api-%E4%B8%8D%E8%A6%81%E6%9C%89cache%E7%9A%84%E5%AF%AB%E6%B3%95 片段程式碼:   HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);   //– //定義此req的緩存策略 //https://msdn.microsoft.com/zh-tw/library/system.net.webrequest.cachepolicy(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1   HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore); request.CachePolicy = noCachePolicy; //– request.Method = “GET”;//request.Method = “POST”;

  • [C#] 幾個常用的取路徑及檔名的方法

    string file = @”d:\abc\123.txt” Path.GetFileNameWithoutExtension(file) 取得檔案名,不包含副檔名,本例得到123 Path.GetExtension(file) 取得副檔名txt Path.GetPathRoot(file) 取得根目錄 Path.GetFullPath(file) 取得路徑

  • [C#] Entity Framework中的DatabaseGenerated屬性

    首先我們必須知道的是在EF中,當某一個屬性視為primary key時,如果該屬性類別為int,則生成資料庫時會自動變成自加序號 那如果不是int而是Guid,那就必須你自己給值,或自己設定為自加序號   如果你的primary key的屬性是Guid,你想讓它自加序號,就加上這個 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 如果你的primary key的屬性是int,你不想讓它自加序號,就加上這個 [DatabaseGenerated(DatabaseGeneratedOption.None)] 另外有一種是 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 若加上這個表示property的值是透過計算得來,它是不會儲存實際的值到資料庫內的.

  • [C#] EntityFramework中的導覽屬性略講

    Entity Framework以資料庫的概念來解釋比較容易理解,它會建立不同的class,這個class裡面只會有屬性(使用DTO) 比如下例 public class Student     {         public int ID { get; set; }         public string LastName { get; set; }         public string FirstName { get; set; }         public DateTime EnrollmentDate { get; set; }     […]