星期三, 10月 28, 2009

用Linq to SQL亂數取一筆

今天遇到一個問題..話說..想要在一個 table 裡亂數抓一筆出來..我們用 t-sql 都會這樣下..

"SELECT TOP (1) *, NEWID() AS rowsNumber FROM dbo.訂貨主檔 ORDER BY rowsNumber"

這樣就可以取出來了..那Linqㄟ..可以很簡單的做到嗎..可以的不過要轉個彎..看code吧..

using (var db = new DataClassesDataContext())
{
int total = db.訂貨主檔s.Count();
int skipRecord = new Random().Next() % total;
var data = db.訂貨主檔s.Skip(skipRecord).Take(1);
GridView1.DataSource = data;
GridView1.DataBind();
}

一點都不難吧..雖然說還是沒有直接下tsql來的爽快..不過轉個彎來達到答案..也是蠻不錯的感覺..^__^||..

參考:
http://msdn.microsoft.com/zh-tw/library/bb386976.aspx

星期三, 10月 21, 2009

(題目)取亂數不重複

今天在網路上逛阿逛..看到了一個題目【取亂數不重複】..感覺蠻有趣的..以我這沒學過演算法的人來說..一定會寫出鳥鳥沒效率的程式..所以直接找了一下goolge..原來有"洗牌演算法"這東西喔..哈..邏輯大概是這樣..

1.先準備好一個陣列a(n)..裡面就是你要取出的數字..
2.用亂數取出陣列的某值a(n)..然後再把最小的a(0)去補a(n)的位置..
3.然後在用亂數去從a(1)~a(n)去取值a(n)..然後再把最小的a(1)去補a(n)的位置..
4.同樣動作繼續下去..就可取出你想要的東西啦..

c#實作..

public class RandomCreator
{
public static int[] GetRandomNumber(int min, int max, int count)
{
if (max - min < 0)
throw new Exception("請輸入正確的範圍");

if ((max - min + 1) < count)
throw new Exception("請輸入想取得的正確數字");

Random r = new Random();
int[] tempArr = Enumerable.Range(min, max - min + 1).ToArray();
int[] resultArr = new int[count];
for (int i = 0; i < count; i++)
{
resultArr[i] = GetRandom(i, r, ref tempArr);
}
return resultArr;
}

private static int GetRandom(int start, Random r, ref int[] array)
{
int v = r.Next(start, array.Length);
int number = array[v];
array[v] = array[start];
return number;
}
}

測試一下..感覺還不錯..有空大家來討論一下吧..

參考:
http://social.msdn.microsoft.com/forums/zh-TW/236/thread/a239d85a-24cc-48a3-9196-00d99bb01e3e/

星期四, 10月 15, 2009

搜尋資料夾內符合"字串"的檔案

最近在處理一些文字的檔案..常常都要在檔案中找到某些關鍵字..我處理的方法是用 dos 裡面的 FINDSTR 的個 command..說真的這真是好用的東西..又支援資源規則運算式..下面有些資源..大家看了就會用啦..

http://www.computerhope.com/findstr.htm
http://freetoad.pixnet.net/blog/post/23437477

不過今天重點不是要講這個..今天是想說..那如果自己寫要怎麼寫阿..剛剛就想了一下..用簡單的方法就可以做到啦..看code吧..

//搜尋的檔案位置
string position = txtPosition.Text;
//搜尋的字
string searchWord = txtSearchWord.Text;

//用linq去處理,這裡是用SelectMany去做..這樣效能會好一點..
var aaaa = Directory.GetFiles(position, "*")
.SelectMany(a => File.ReadAllLines(a), (a, b) => new { FileName = new FileInfo(a).Name, b })
.Where(a => a.b.Contains(searchWord))
.GroupBy(a => a.FileName, b => b.b);

//組出字串
string str = string.Empty;
string br = "\r\n";
foreach (var a in aaaa)
{
str += string.Format("*********{0}*********{1}", a.Key, br);
foreach (var b in a)
{
str += string.Format("{0}{1}{1}", b, br);
}
}
txtContent.Text = str;

結果就是這樣啦..

image

這是用很簡單的方法去做啦..如果要改善..可能就用遞迴去搜尋..再多加一點可調整的參數..這樣就可以騙吃騙吃啦..^_____^||..

參考:
http://msdn.microsoft.com/zh-tw/library/bb534336%28VS.95%29.aspx

星期五, 10月 09, 2009

.net 輸出 Excel 的報表

今天在輸出 excel 報表..發現怎麼輸出中文都變成亂碼..網路上找了一堆資料..零零碎碎的東湊西湊的..終於解決問題..這裡紀錄一下..以後有需要的人可以輕鬆解決這個問題..看 code 吧..

protected void Page_Load(object sender, EventArgs e)
{
string encoding = "utf-8";
Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment; filename=Report.xls");
Response.ContentEncoding = System.Text.Encoding.GetEncoding(encoding);
Response.Charset = encoding;

using (DataClassesDataContext db = new DataClassesDataContext())
{
GridView1.DataSource = db.訂貨主檔s.Take(10);
GridView1.DataBind();
}

StreamWriter sw = new StreamWriter(
Response.OutputStream, System.Text.Encoding.GetEncoding(encoding));
System.IO.StringWriter tw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
GridView1.RenderControl(hw);
sw.Write(tw.ToString());
sw.Flush();
Response.End();
}

不過上面的code會產生一個錯誤..如下..

Control 'GridView1' of type 'GridView' must be placed inside a form tag with runat=server.

這意思是說..我必需要把 gridview 這個 control 這放在 form 裡面..由於我要產生 Excel 報表..當然會有問題..所以要把 Page 檢查 control 是不是有在 form 那個 method 覆寫掉才行..

public override void VerifyRenderingInServerForm(Control control)
{
//base.VerifyRenderingInServerForm(control);
}

解決..收工..

參考:
http://msdn.microsoft.com/zh-tw/library/system.web.ui.page.verifyrenderinginserverform%28VS.80%29.aspx
http://www.w3schools.com/media/media_mimeref.asp
http://msdn.microsoft.com/en-us/library/ms525405.aspx

星期六, 10月 03, 2009

Email Sender Library

最近需要寫一個寄發 email 的程式, 記得網路上有一堆範例, 所以就 goolge 一下, 找到一個 liberary, 看了一了裡面的 source code, 這個 liberary 有支援 smtp ,gmail 和附件的寄發該有的基本功能都幫你寫好了, 直接拿來測試使用, 看 code 吧..

EmailSender.SmtpSender gs = new EmailSender.SmtpSender("totalbb.net.tw");
EmailSender.Message msg = new EmailSender.Message();
msg.Subject = "EmailSender測試";
msg.From = "Bibby <nstl388812@yahoo.com.tw>";
msg.To = "bibby <nstl388812@yahoo.com.tw>;bibbyGmail <bibbynet@gmail.com>";
msg.Bcc = "bibby <nstl388812@yahoo.com.tw>";
msg.Cc = "bibby <nstl388812@yahoo.com.tw>";
msg.Body = "EmailSender測試<br />EmailSender測試";
msg.Format = EmailSender.Format.Html;
EmailSender.MessageAttachment attachment = new EmailSender.MessageAttachment(
System.Net.Mime.MediaTypeNames.Application.Zip,
Server.MapPath("~/EmailSender/aa.rar"));
msg.Attachments.Add(attachment);
msg.Encoding = System.Text.Encoding.GetEncoding("Big5");
gs.Send(msg);

很簡單, 這樣該有個功能都有啦, 不過話說還是有點小缺憾啦 ,這liberary的"副本"和"密件副本"不能有多個 mail address, 我修改一下SmtpSender.cs 這一隻檔案, 就可以多個 mail address 啦..

if (!String.IsNullOrEmpty(message.Cc)) {
mailMessage.CC.Add(message.Cc);
}

if (!String.IsNullOrEmpty(message.Bcc)) {
mailMessage.Bcc.Add(message.Bcc);
}
//---------------------修改成下面---------------------------
if (!String.IsNullOrEmpty(message.Cc))
{
//修改成可以加入多個email address
string[] addressArr = message.Cc.Split(new char[] { ';', ',' });
foreach (string address in addressArr)
{
mailMessage.CC.Add(address);
}
}

if (!String.IsNullOrEmpty(message.Bcc))
{
//修改成可以加入多個email address
string[] addressArr = message.Bcc.Split(new char[] { ';', ',' });
foreach (string address in addressArr)
{
mailMessage.Bcc.Add(address);
}
}

最後感謝一下寫這 liberary 的作者啦..乾溫乾溫..

參考: