2009-02-23

C# – Recursion & XmlTextWriter

image

最近因為程式的需要,必須提供一個功能給使用者 就是能讓他們自己建立TreeNode 這個部分相當簡單。。 只要去指定每個TreeNode的ContextMenuStrip屬性

   1:  TreeNode tnAdd = new TreeNode(NodeName);
   2:  tnAdd.ContextMenuStrip = contextMenuStrip1;

只是使用者還需要一個功能 就是能將所建立的Tree整個備份下來 當然,我直覺想到的是XML格式 因為除了要儲存每個Node名稱外 也需要儲存相關Node的資訊(像是Folder資訊、Document資訊) 在這裡我使用兩個主要的方式
1.Recursion(遞迴)
2.XmlTextWriter物件
使用Recursion是因為我並不清楚 底下會長出多少個Node,也就是我不清楚要用多少個迴圈 來找出所有的Node,利用Recursion 可以讓我不需要知道,也可以一層一層找下去 在寫Xml檔案時,我使用XmlTextWriter物件

   1:  string strFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
   2:  strFolder=string.Format(@"{0}\{1}",strFolder,"DDA.xml"); 
   3:  //---Xml write---- 
   4:  using (XmlTextWriter xtw = new XmlTextWriter(strFolder, Encoding.UTF8)) 
   5:  { 
   6:    xtw.Formatting = Formatting.Indented;
   7:    xtw.WriteStartDocument();
   8:    xtw.WriteStartElement("List"); 
   9:    WriteElement(xtw, tvList.Nodes); 
  10:    xtw.WriteEndDocument(); 
  11:  }
  12:   
  13:  //---Recursion---- 
  14:  private void WriteElement(XmlTextWriter xtwThis, TreeNodeCollection tnCurrentNodes) 
  15:  { 
  16:    foreach (TreeNode thisNode in tnCurrentNodes) 
  17:    { 
  18:      xtwThis.WriteStartElement(thisNode.Text); 
  19:      if (thisNode.Nodes.Count>0) 
  20:      { 
  21:          WriteElement(xtwThis, thisNode.Nodes); 
  22:      } 
  23:    xtwThis.WriteEndElement();
  24:    } 
  25:  } 
  26:   

簡單寫下這些紀錄,可以供以後做參考用 在寫這支程式時,遇到一個小問題 就是我嘗試要在XML的主目錄下,建立多個Element 這會產生錯誤,在主目錄中只能增加一個Element 不曉得是不是這樣,先記錄下來。

參考資料
1.
http://chrisbalboa.wordpress.com/2007/10/02/aspnetxmltextwriter-demo-%E7%AF%84%E4%BE%8B/
2.
http://www.builder.com.cn/2007/0924/521705.shtml
3.
http://www.cnblogs.com/chen79/archive/2008/01/05/1027064.html

2009-02-18

Linq 基本語法 - Join

Join
The Join operator performs an inner equijoin on two sequences based on keys extracted from each element in the sequences.

public static IEnumerable<V> Join<T, U, K, V>(
this IEnumerable<T> outer,
IEnumerable<U> inner,
Func<T, K> outerKeySelector,
Func<U, K> innerKeySelector,
Func<T, U, V> resultSelector);


在這裡建立了兩個List
List ltUser = new List(20);
for (int i = 0; i < 20; i++)
{
  ltUser.Add(new User(i,"AA"));                
}
 
List ltUserInfo = new List(10);
for (int i = 0; i < 10; i++)
{
  ltUserInfo.Add(new UserInfo(i,"CC"));                
}

Linq語法如下:
var Users=ltUser.Join(ltUserInfo,
  a=>a.No,
  b=>b.No,
  (a,b)=>new{id=a.No,UserName=a.Name,Department=b.Department});
 
StringBuilder sb=new StringBuilder();
foreach (var item in Users)
{
  sb.AppendLine(item.ToString());                           
}
richTextBox1.Text=sb.ToString();

最後產生如下結果
image

最後產生的結果,有點像是Inner Join
其實最近有點懶散,並沒有很仔細去看這本書
今天就先練習到這。

Linq 基本語法 – Reverse

其實這一系列Linq基本語法
都有點像是在走馬看花,就大概看過有個印象
現在專案也並未運用到,就看看之後是否會使用這項技術
 

Reverse:
The reverse operator outputs a sequence of the same type as the input sequence but in the reverse order.

IEnumerable items = presidents.Reverse();
StringBuilder sb = new StringBuilder();
 
foreach (var item in items)
{
  sb.AppendLine(item);
}
 
richTextBox1.Text = sb.ToString();

最後得到如下結果:
image
其實Reverse就如解釋中所說的,只是反轉資料。