# 方法

## 取得檔案名稱

```
GetFileNameWithoutExtension(filename)); //取得副檔名以前的部分
GetExtension(filename)); //取得副檔名
Path.GetPathRoot(filename)); //取得根目錄
Path.GetFullPath(filename)); //取得路徑
```

## 抓取網頁上的資料

```
WebClient wc = new WebClient(); //

        MemoryStream ms = new MemoryStream(wc.DownloadData(RSS_Source.Address));
        XDocument doc = XDocument.Load(ms);
        var query = (from feed in doc.Descendants("item")
                     select new
                     {
                         Title = feed.Element("title").Value,
                         Description = feed.Element("description").Value,
                         Date = DateTime.Parse(feed.Element("pubDate").Value),
                         link = feed.Element("link").Value,
                         testImage = feed.Elements("image").ToArray()
                     }).ToArray();
```

## List 的方法

增加項目

```
void ListObject.Add(item);
```

檢查是否包含在List裡面

```
boolean ListObject.Contains(item);
```

直接創建一個新的相同內容的List物件

```
List<T> NewList = new ListObject.ToList();
```

## 字串切割

```
string str = "hello[myfriend]";
int indexS = 0;
int indexE = 0;
indexS = str.IndexOf("[");
indexE = str.IndexOf("]");
Console.WriteLine(str.Substring(indexS+1,indexE-indexS-1));
//myfriend
```

假如字串都有規律

```
str = str.Replace("hello[","").Replace("]","");
```

也可以得到相同效果

## URL解析

參考資料:ASP.NET 如何取得 Request URL 的各個部分(<https://blog.miniasp.com/post/2008/02/10/How-Do-I-Get-Paths-and-URL-fragments-from-the-HttpRequest-object.aspx>)

## 判斷物件是否為null

參考資料:(<https://msdn.microsoft.com/zh-tw/library/w4hkze5k(v=vs.110).aspx>)

```
boolean Object.Equals(obj1,obj2);
```

obj2 放 null\
obj1 放想要測試的物件即可

## 判斷字串為空或者null

```
boolean string.IsNullOrEmpty(str)
```

## 開執行緒去呼叫外部程式

```
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "檔案路徑";
p.StartInfo.Arguments = 參數1 + " " + 參數2;
p.StartInfo.UseShellExecute = false;
p.Start();
```

## DataTable

參考資料:(<https://dotblogs.com.tw/chjackiekimo/2014/04/03/144606>)

參考資料:(<https://docs.microsoft.com/zh-tw/dotnet/framework/data/adonet/dataset-datatable-dataview/adding-data-to-a-datatable>)

## 產生隨機字串

參考資料:(<http://limitedcode.blogspot.tw/2014/06/c_14.html>)

```
string RandomPasswordString = System.Web.Security.Membership.GeneratePassword(字串長度,特殊字元數量);
```

## 時間差、兩個DateTime之間的差異

參考資料:(<https://dotblogs.com.tw/skyline0217/2011/04/21/23269>)

參考資料:(<https://blog.miniasp.com/post/2008/01/22/Find-the-difference-between-two-DateTime.aspx>)

有Total 的 回傳值為double 沒有的 回傳值為 int 並無條件捨去

```
TimeSpan ts = datetime1 - datetime2;
ts.days //天數 無條件捨去
ts.Hours //小時 為 (總數 % 86400) / 3600
ts.Minutes //分鐘 為 ((總數 % 86400) % 3600) / 60
ts.TotalMinutes //總分鐘 總數 / 60
```

## 抓取LocalIP

參考資料:(<https://dotblogs.com.tw/mingstyle/2013/03/09/96041>)

```
using System.Net;

// 取得本機名稱
string strHostName = Dns.GetHostName();
// 取得本機的IpHostEntry類別實體，用這個會提示已過時
//IPHostEntry iphostentry = Dns.GetHostByName(strHostName);

// 取得本機的IpHostEntry類別實體，MSDN建議新的用法
IPHostEntry iphostentry = Dns.GetHostEntry(strHostName);

// 取得所有 IP 位址
foreach (IPAddress ipaddress in iphostentry.AddressList)
{
    // 只取得IP V4的Address
    if (ipaddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
    {
        Console.WriteLine("Local IP: " + ipaddress.ToString());
    }
}
```

## 重新導向

參考資料:(<https://msdn.microsoft.com/zh-tw/library/540y83hx(v=vs.100).aspx>)

```
Response.Redirect("http://www.microsoft.com/gohere/look.htm");
```

## 將後端資料丟給前端JavaScript

KeyWord : HiddenField

拿來當作資料儲存區，後端撈取完資料，整理成JSON格式，丟進去HiddenField，再讓前端用jQuery去取出來用。

可以去參考:Brian's雜記>雜記>前端>JSON

## out ref

參考資料:(<https://dotblogs.com.tw/erictsaiblog/2015/05/10/151238>)

參考資料:(<https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/arrays/passing-arrays-using-ref-and-out>)

out & ref 都要先指派好變數，然後再丟去該位置接值。

差異

out 傳進去前不用初始化，但是方法內要初始化。

ref 傳進去前需要初始化，但方法內隨便用。

## 為控制項增加HTML 屬性

參考資料:(<https://dotblogs.com.tw/mis0800/2014/02/17/144025>)

EX:點擊清空

```
txt1.Attributes.Add("onFocus","this.value=''");
```

## Console.ReadLine 相關

Console.ReadLine 只能讀取長度 254 (256 - 兩個字元)

倘若一行超過這個長度，有兩種方法:

1.開一個新的輸入流

參考資料:(<https://blog.csdn.net/zfrong/article/details/5457600>)

```
Stream inputStream = Console.OpenStandardInput(5000); 

Console.SetIn(new StreamReader(inputStream)); 

string body = Console.ReadLine();
```

2.自己寫一個ReadLine 出來

參考資料:(<https://docs.microsoft.com/en-us/dotnet/api/system.console.openstandardinput?redirectedfrom=MSDN&view=netframework-4.7.2#overloads>)

成品大致上長這樣

```
public static string ReadLineMoreLength(int size)
{
      Console.InputEncoding = Encoding.Unicode;
      Console.OutputEncoding = Encoding.Unicode;

      Stream inputStream = Console.OpenStandardInput(size);
      byte[] bytes = new byte[size];
      int outputLength = inputStream.Read(bytes, 0, size);
      //Console.WriteLine(outputLength);
      char[] chars = Encoding.Unicode.GetChars(bytes, 0, outputLength);
      return new string(chars);
}
```

我當初參考的範例中，並沒有上面那兩個編碼設定，底下的GetChars部分如下

```
char[] chars = Encoding.UTF7.GetChars(bytes, 0, outputLength); //原先範例

char[] chars = Encoding.Unicode.GetChars(bytes, 0, outputLength); //Brian 改寫
```

當時會導致字串中的中文變成亂碼，後來參考了一些資料後，改寫成上面那樣，就正常了。

參考資料:(<https://stackoverflow.com/questions/9502488/reading-unicode-from-console/9555255>)

參考資料:(<https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding?view=netframework-4.7.2>)

同場加映:

字串編碼問題、比對

參考資料:(<https://dotblogs.com.tw/yc421206/archive/2011/06/09/27596.aspx>)
