alarmClock
GetPulse()
/ /
注释,不使用/* */
注释代码如下
函数定义如下
static void SwapTwoNum<T>(ref T val1, ref T val2)
{
T swap;
swap = val1;
val1 = val2;
val2 = swap;
}
在在函数中调用如下
int a = 1, b = 2;
double c = 1.0, d = 2.0;
SwapTwoNum<int>(ref a,ref b);
SwapTwoNum<double>(ref c, ref d);
可以实现对a,b和c,d的值的交换(此处使用引用类型直接改变变量的值)不用对函数进行覆写,直接改变函数后T的类型即可
Swap<T1,T2>(ref T1 val1 , ref T2 val2)
则在运行时会出错。隐式接口
void ImplicitBark();
是隐式接口,类继承该接口时,需要重新定义该接口public void ImplicitBark()
,关于调用隐式接口的方法
way 1
IBark ie = new InterfaceExample();
ie.ImplicitBark();
way 2
InterfaceExample ie = new InterfaceExample();
ie.ImplicitBark();
显式接口
void IBark.ExplicitBark()
来定义该方法,而且不能用public、protected、private等定义显示接口的定义方法
way 1
IBark ie = new InterfaceExample();
ie.ExplicitBark();
注:隐式接口的第二种方法在此处不适用,否则会报错。若是想用,需要进行强制类型转换
InterfaceExample ie = new InterfaceExample();
((IBark)ie).ExplicitBark();
代码
类和接口定义
public interface IBark
{
void ImplicitBark();
void ExplicitBark();
}
public class InterfaceExample : IBark
{
public InterfaceExample()
{
}
public void ImplicitBark()
{
Console.WriteLine(" this is ImplicitBark ");
}
void IBark.ExplicitBark()
{
Console.WriteLine(" this is ExplicitBark ");
}
}
main.c
IBark ie = new InterfaceExample();
ie.ImplicitBark();
ie.ExplicitBark();
int[] a;
string[] b ={ "篮球", "足球", "排球", "网球", "羽毛球", "乒乓球" };
int[] a = new int[10];
foreach(int i in ArrayA)
int[ , ] a;
int[ , ] a ={ { 3, 5, 7 }, { 2, 4, 6 }, { 9, 5, 1 } };
float[ , ] score = new float[7,5];
int [][] a = new int[12][];
,该二维数组的每一行的元素个数都可以不相同Array arr = Array.CreateInstance(Type type, int[]length, int[]lowbound);
b = (int[])a.Clone();
:将a复制到b中a.CopyTo(b,2);
:将a复制到b中,b从b[2]开始改变关于复制还有一种方法
代码
int[] a = { 1, 2, 3, 4, 5, 6, 7 };
int[] b = a;
常用以下方法测量算法运行时间(不考虑编译器处理其他事情消耗的时间)
TimeSpan duration;
/*algorithm you want to check should be placed here*/
//...
/*end of you algorithm*/
duration = Process.GetCurrentProcess().TotalProcessorTime;
Console.WriteLine(duration.TotalSeconds);
采用LIFO(先入后出)的结构,主要应用如下
进制转换函数
//将10进制的数num转化为b进制的数,将转化后的数以栈的形式返回
//栈的顶部是最高位,底部是最低位
static Stack HexConversion(int num, int b)
{
Stack digits = new Stack();
do
{
digits.Push(num % b);
num /= b;
}while( num != 0 );
return digits;
}
观察结果的代码如下
Stack stack4Three = new Stack();
stack4Three = HexConversion(100,8); //将100的10进制转化为8进制
while (stack4Three.Count > 0)
{
Console.Write(stack4Three.Pop());
}
Console.WriteLine();
这里主要是对文件进行复制、删除、移动、新建等操作
引入流的概念,对文件读或写
写入文件时,需要将字符串转换为字节数组,实现方法如下
string a = "123";
ASCIIEncoding b = new ASCIIEncoding();
byte[] c = b.GetBytes(a); //
之后就可以将字节数组c写入文件中,如果此时a字符串是中文字符,则转换的过程中会出现信息丢失的现象(只保留低8位)
在窗口中绘制好图像后,改变窗口大小或者最小化、最大化等操作时,绘制的图像会“消失”,要想使图像信息不丢失,需要在窗口中添加Paint事件,每次绘制时,需要重新绘制该图像
private void CClockExercise_Paint(object sender, PaintEventArgs e)
{
Graphics Pic = CPbDispGraph.CreateGraphics();
Pen MyPen = new Pen(Color.Red);
Pic.DrawEllipse(MyPen
, 0, 0
, CPbDispGraph.Width - 1, CPbDispGraph.Height - 1);
Pic.DrawLine(MyPen
, new Point(0, 0)
, new Point(CPbDispGraph.Width - 1, CPbDispGraph.Height - 1));
Pic.Dispose();
}
注:这种方法实现重绘时,速度比较慢,有时改变控件大小后,需要较长时间才能看到改变后的效果。
慢的原因
改进后的代码如下:
private void CPbDispGraph_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
PointF[] pt = new PointF[360]; //定义点数组
using (Pen pen = new Pen(Color.Black)) //定义画笔
{
for (int i = 0; i < 720; i += 2) //计算获得曲线上每个点的坐标
{
pt[i / 2].X = i / 2;
pt[i / 2].Y = (float)(60 - 50 * Math.Sin(Math.PI / 180 * i));
}
g.DrawLine(pen, 0, 60, 400, 60); //绘制一条表示数轴的直线
g.DrawCurve(pen, pt); //绘制基数样条构成的正弦曲线
}
}
这段代码是PictureBox的重绘函数
代码
Bitmap bmpBuffer = new Bitmap(CPbRealTimePlot.Width , CPbRealTimePlot.Height);
Graphics g = Graphics.FromImage(bmpBuffer);
//以下的Using表明pen的作用域,当这段代码执行结束之后,会释放pen资源
using (Pen pen = new Pen(Color.Blue)) //定义画笔
{
//数据平移与计算
for (int i = 0; i < NUM_TO_DISP-1; i++)
{
ptForRealTimeDisp[i].Y = ptForRealTimeDisp[i + 1].Y;
}
ptForRealTimeDisp[NUM_TO_DISP-1].Y = 50 + 50 * (float)Math.Sin(2*Math.PI* numForSinPlot/NUM_TO_DISP);
numForSinPlot++;
if (numForSinPlot == NUM_TO_DISP)
numForSinPlot = 0;
//绘图
g.Clear(Color.White); // 首先清除图像,再进行绘制
g.DrawLine(pen, 0, 50, 400, 50); //绘制一条表示数轴的直线
g.DrawCurve(pen, ptForRealTimeDisp); //绘制基数样条构成的正弦曲线
}
//下面这段代码将Bitmap资源释放到窗口中并显示
using (Graphics tg = CPbRealTimePlot.CreateGraphics())
{
tg.DrawImage(bmpBuffer, 0, 0);
}
链接网址
在通过值传递作为方法参数的变量时,传递给方法的是数据副本。在方法中对该数据的任何修改都不会对初始值有任何影响。
static void DoSomething(int parameter)
如果传递引用的话,那么无论在程序的什么地方作改变的话(可能是在另一个方法、属性中,甚至是另一个对象中),都会改变使用改引用的值。对方法中任何参数的改变都将影响方法的返回值。
static void DoSomething(ref int parameter)
传递的是对象的引用
static void DoSomething(Person somePerson)
如果按照如下方法,则不会修改主程序中somePerson的一些属性
static void DoSomething(Person somePerson)
{
somePeron=new Person(100); //创建一个新对象,赋值会不起作用
}
如果按照以下方法,则会修改主程序中somePerson的一些属性
static void DoSomething(Person somePerson)
{
somePerson.Age=100; //这个对象相当于一个引用,直接改变其属性即可
}
Environment.TickCount
:以毫秒为单位 ,一般对应开机时间为窗口添加ResizeBegin事件
private void CClockExercise_ResizeBegin(object sender, EventArgs e)
{
BeforeSize = this.Size;//获取之前的窗口大小
}
为窗口添加ResizeEnd事件
private void CClockExercise_ResizeEnd(object sender, EventArgs e)
{
Size EndSize = this.Size;
float percentWidth;
float percentHeight;
//获得变化比例
percentWidth = (float)EndSize.Width / BeforeSize.Width;
percentHeight = (float)EndSize.Height / BeforeSize.Height;
ChangeAllSzie(this,percentWidth,percentHeight);//调用递归函数,改变控件的大小
}
其中,上面的ChangeAllSzie函数是递归的,描述如下
private void ChangeAllSzie(Control control , float percentWidth , float percentHeight)
{
foreach (Control ctrl in control.Controls)
{
//按比例改变控件大小
ctrl.Width = (int)(ctrl.Width * percentWidth);
ctrl.Height = (int)(ctrl.Height * percentHeight);
//为了不使控件之间覆盖 位置也要按比例变化
ctrl.Left = (int)(ctrl.Left * percentWidth);
ctrl.Top = (int)(ctrl.Top * percentHeight);
if (ctrl.HasChildren)//如果容器中还有子容器,则进行递归
{
ChangeAllSzie(ctrl, percentWidth, percentHeight);
}
}
}
注意
this.button1.Click += new System.EventHandler(this.button1_Click);
,这通常在#region Windows 窗体设计器生成的代码
中隐藏,需要将其展开using System.Diagnostics;
Process.Start("CMD.Exe");
,或者其他命令也可以在CLR出来之后,Windows系统资源开始分为“非托管资源”和“托管资源”。
GDI绘图中,如果新建画笔、笔刷、图像等对象时,因为比较占用系统资源,因此在函数执行结束,即绘图完成时,需要将其释放,用pen.Dispose()即可。或者采用以下方法:
using (Pen pen = new Pen(Color.Black)) //定义画笔
{
for (int i = 0; i < 720; i += 2) //计算获得曲线上每个点的坐标
{
pt[i / 2].X = i / 2;
pt[i / 2].Y = (float)(60 - 50 * Math.Sin(Math.PI / 180 * i));
}
g.DrawLine(pen, 0, 60, 400, 60); //绘制一条表示数轴的直线
g.DrawCurve(pen, pt); //绘制基数样条构成的正弦曲线
}
这是确定了Pen的生命周期,即这段代码执行完之后,Pen资源就会被系统释放。
为TextBox添加KeyPress的事件,代码如下
private void CTbSecondSet_KeyPress(object sender, KeyPressEventArgs e)
{
if ((!Char.IsNumber(e.KeyChar))
&& (e.KeyChar != (char)8)) //判断按下的字符是数字或者退格,若都不是,则提示用户输入数字
{
e.Handled = true;
MessageBox.Show("请输入数字");
}
else
{
e.Handled = false;
}
}
如需要对数字判断大小,看是否在合理范围内,则需要通过给TextBox添加Leave事件,代码如下
private void CTbHourSet_Leave(object sender, EventArgs e)
{
if (CTbHourSet.Text.Equals(""))
CTbHourSet.Text = "0";
if (Convert.ToInt32(CTbHourSet.Text) < 0
|| Convert.ToInt32(CTbHourSet.Text) >= 24)
{
CTbHourSet.Clear();
MessageBox.Show("请输入有效的时间范围");
}
}
Point pt = MousePosition;
,得到鼠标的值,可以通过pt.X
和pt.Y
得到其X、Y的坐标值,原点是电脑屏幕左上角Point pt2= this.PointToClient(pt);
,获得鼠标在窗体上的坐标值,即以窗体的原点为屏幕原点,对pt进行整体平移try...catch...
抛出异常。有以下几种方法
* 直接新建webpart然后插入xap文件an,不过对于xap的url地址,我不是特别清楚,也没有尝试成功
* 先将silverlight产生的xap文件保存在sharepoint的文档库中,此时xap文件的url地址更加方便一点,找到那个文档,右击复制链接即可
初始化
private CStopCondition stopCondition = new CStopCondition();
private ProTest.温升实验DataContext dc = null; //重点!之后都是对这个对象进行操作
数据连接服务
private bool IsConnect( )
{
try
{
dc = new ProTest.温升实验DataContext(
new Uri("http://win-ubfvccleemg/sites/ProTest/_vti_bin/ListData.svc/"));//存储数据的网址
//dc.Credentials = CredentialCache.DefaultCredentials;
NetworkCredential nc = new NetworkCredential("jiang", "qwer1234-");//帐号和密码
dc.Credentials = nc;
return true;
}
catch
{
return false;
}
}
增加数据项
private bool AddData(CStopCondition cSc)
{
if (dc.停止条件列表.Where(c => c.名字 == cSc.name).FirstOrDefault() == null)
{
ProTest.停止条件列表Item pt = new ProTest.停止条件列表Item();
pt.名字 = cSc.name;
pt.数据 = cSc.Serialize();
pt.标准 = cSc.referCriterion;
pt.描述 = cSc.description;
pt.参数 = cSc.parameters;
pt.种类 = cSc.kind.ToString();
dc.AddTo停止条件列表(pt);
dc.SaveChanges();
return true;
}
else
{
return false;
}
}
修改数据项
private bool ChangeData()
{
int num = dc.停止条件列表.Where(c => c.名字 == stopCondition.name).Count();
if (num >= 1 && (nameOld != stopCondition.name))
{
return false;
}
else
{
var item = dc.停止条件列表.Where(c => c.名字 == nameOld).FirstOrDefault();
item.名字 = stopCondition.name;
item.数据 = stopCondition.Serialize();
item.标准 = stopCondition.referCriterion;
item.描述 = stopCondition.description;
item.参数 = stopCondition.parameters;
item.种类 = stopCondition.kind.ToString();
dc.UpdateObject(item);
dc.SaveChanges();
return true;
}
}
查询数据项
private bool QueryData(string name)
{
if (dc.停止条件列表.Where(c => c.名字 == name).FirstOrDefault() != null)
{
var results = (from item in dc.停止条件列表
where item.名字 == name
select new
{
data = item.数据
});
string str = "";
foreach (var res in results)
{
str += res.data;
}
MessageBox.Show(str);
return true;
}
else
{
return false;
}
}
删除数据项
private bool DeleteData(string name)
{
if (dc.停止条件列表.Where(c => c.名字 == name).FirstOrDefault() != null)
{
dc.DeleteObject(dc.停止条件列表.Where(c => c.名字 == name).FirstOrDefault());
dc.SaveChanges();
return true;
}
else
{
return false;
}
}
SilverlightApplication1\SilverlightApplication1.Web\ClientBin
的文件夹中生成xap文件,将此文件放入sharepoint的文档库中,然后在网页中插入webpart,其指定的路径即xap存储对应的路径。也可以放在服务器可以访问到的路径,但此时网页缓存的问题难以解决说明:因为silverlight和sharepoint关联时,是进行异步通信的,对数据的增上改查等操作都需要异步通信编程
* 初始化
private Condition stopCondition = new Condition();
private PageProperty pagePro = PageProperty.IsAdd;//存储网页是新建还是编辑
private ProTest.温升实验DataContext dc = null;
//进入该网页时,会有相关信息,
//包括操作的数据项(如果有的话),以及跳转的原网页等信息,将其存储在字典里
private IDictionary<string, string> webInfo = HtmlPage.Document.QueryString;
* 增加数据
private void AddData(Condition cSc)
{
bool addFail = false;
//异步
try
{
dc.StopCondition02.BeginExecute((result) =>
{//lamda表达式
try
{
var items = dc.StopCondition02.EndExecute(result);
//下面这句话需要尝试一下,因为之前这个查询的任务不能运行
//if (items.Where(c => c.名字 == stopCondition.name) != null)
foreach (var item in items)
{
if (item.名字 == stopCondition.name)
{
addFail = true;
break;
}
}
if(addFail)
{
CTbForDebug.Text += "新建页中已有该名称,无法添加停止条件\n";
}
else
{
ProTest.StopCondition02Item pt = new ProTest.StopCondition02Item();
pt.名字 = cSc.name;
pt.数据 = cSc.Serialize();
pt.标准 = cSc.referCriterion;
pt.描述 = cSc.description;
pt.参数 = cSc.parameters;
pt.种类 = cSc.kind.ToString();
dc.AddToStopCondition02(pt);
dc.BeginSaveChanges((ar) =>
{
if (ar.IsCompleted)
{
CTbForDebug.Text += "添加成功\n";
CloseThisPage();
}
else
{
CTbForDebug.Text += "添加失败\n";
}
}, null);
}
}
catch (Exception ex)
{
CTbForDebug.Text += ex.Message;
}
}, null);
}
catch(Exception ee)
{
MessageBox.Show(ee.ToString());
}
}
* 编辑数据
编辑数据的语句和添加数据类似,只是有以下几个地方需要注意:
* 需要新建一个数据项的对象,当var对象找到时(数据库中对应的数据项),将var类型隐式转换为数据项对象,之后直接修改这个数据项的对象即可
* 修改结束后,需要利用以下方式进行更新
//dc.AttachTo("StopCondition02", (ProTest.StopCondition02Item)forChg);//这句话不加竟然也可以运行成功。。
dc.UpdateObject(forChg);
第一句是将数据和数据项进行关联,然而自己操作的时候发现根本不需要这一句。。boss之前测试说需要,我就先在这里注释掉,不行再加上。。
* 保存数据库
* 保存数据
dc.BeginSaveChanges((ar) =>
{
if (ar.IsCompleted)
{
CTbForDebug.Text += "修改成功\n";
CloseThisPage();
}
else
{
CTbForDebug.Text += "修改失败\n";
}
}, null);
* 注:关于lamda表达式的使用问题
* 当初它的引入是为了方便编程,即省略某些函数的作用
* 现在发现,siverlight操作sharepoint的数据时,我因为不熟,不敢随意改,导致现在的函数都是有多层嵌套的问题,显得特变乱。
* 当嵌套层次比较多时,不建议用lamda表达式,直接用普通的异步编程即可。。然而我并没有学过。。
using ThoughtWorks.QRCode.Codec;
代码如下
private void GenerateQR()
{
//Image image;
//image = qrCodeEncoder.Encode(data, Encoding.UTF8);
//MemoryStream ms = new MemoryStream();
//image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
//byte[] bt = ms.ToArray();
}
/// 生成二维码
/// </summary>
/// <param name="strData">要生成的文字或者数字,支持中文。如: "4408810820 深圳-广州" 或者:4444444444</param>
/// <param name="qrEncoding">三种尺寸:BYTE ,ALPHA_NUMERIC,NUMERIC</param>
/// <param name="level">大小:L M Q H</param>
/// <param name="version">版本:如 8</param>
/// <param name="scale">比例:如 4</param>
/// <returns></returns>
public void CreateCode_Choose(string strData, string qrEncoding, string level, int version, int scale)
{
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
string encoding = qrEncoding;
switch (encoding)
{
case "Byte":
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
break;
case "AlphaNumeric":
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;
break;
case "Numeric":
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;
break;
default:
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
break;
}
qrCodeEncoder.QRCodeScale = scale;
qrCodeEncoder.QRCodeVersion = version;
switch (level)
{
case "L":
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
break;
case "M":
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
break;
case "Q":
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
break;
default:
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
break;
}
//文字生成图片
Image image = qrCodeEncoder.Encode(strData);
string filename = DateTime.Now.ToString("yyyymmddhhmmssfff").ToString() + ".jpg";
string filepath = @"./jpg/";
//如果文件夹不存在,则创建
if (!Directory.Exists(filepath))
Directory.CreateDirectory(filepath);
FileStream fs = new FileStream(filepath+filename, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
fs.Close();
image.Dispose();
}
说明
代码
private string data = "233333";
CreateCode_Choose(data , "BYTE" , "L" , 8 , 4 );//这里的参数均是比较常用的参数
代码
public Image GCode(String data)
{
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
qrCodeEncoder.QRCodeScale = 5;
qrCodeEncoder.QRCodeVersion = 7;
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
var pbImg = qrCodeEncoder.Encode(data, System.Text.Encoding.UTF8);
var width = pbImg.Width / 10;
var dwidth = width * 2;
Bitmap bmp = new Bitmap(pbImg.Width + dwidth, pbImg.Height + dwidth);
Graphics g = Graphics.FromImage(bmp);
var c = System.Drawing.Color.White;
g.FillRectangle(new SolidBrush(c), 0, 0, pbImg.Width + dwidth, pbImg.Height + dwidth);
g.DrawImage(pbImg, width, width);
g.Dispose();
return bmp;
}
/// <summary>
/// 调用此函数后使此两种图片合并,类似相册,有个
/// 背景图,中间贴自己的目标图片
/// </summary>
/// <param name="sourceImg">粘贴的源图片</param>
/// <param name="destImg">粘贴的目标图片</param>
public static System.Drawing.Image CombinImage(System.Drawing.Image imgBack, string destImg)
{
Image img = System.Drawing.Image.FromFile(destImg); //照片图片
if (img.Height != 50 || img.Width != 50)
{
img = KiResizeImage(img, 50, 50, 0);
}
Graphics g = Graphics.FromImage(imgBack);
g.DrawImage(imgBack, 0, 0, imgBack.Width, imgBack.Height); //g.DrawImage(imgBack, 0, 0, 相框宽, 相框高);
//g.FillRectangle(System.Drawing.Brushes.White, imgBack.Width / 2 - img.Width / 2 - 1, imgBack.Width / 2 - img.Width / 2 - 1,1,1);//相片四周刷一层黑色边框
//g.DrawImage(img, 照片与相框的左边距, 照片与相框的上边距, 照片宽, 照片高);
g.DrawImage(img, imgBack.Width / 2 - img.Width / 2, imgBack.Width / 2 - img.Width / 2 , img.Width, img.Height);
GC.Collect();
return imgBack;
}
///
/// Resize图片
///
/// 原始Bitmap
/// 新的宽度
/// 新的高度
/// 保留着,暂时未用
/// 处理以后的图片
public static Image KiResizeImage(Image bmp, int newW, int newH, int Mode)
{
try
{
System.Drawing.Image b = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(b);
// 插值算法的质量
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
g.Dispose();
return b;
}
catch
{
return null;
}
}
运行以下:
string data = "2333";
Image im0 = GCode(data);
Image im1 = CombinImage(im0 , "1.jpg");//重点所在
string filename = DateTime.Now.ToString("yyyymmddhhmmssfff").ToString() + ".jpg";
string filepath = @"./jpg/";
//如果文件夹不存在,则创建
if (!Directory.Exists(filepath))
Directory.CreateDirectory(filepath);
FileStream fs = new FileStream(filepath + filename, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
im1.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg); //保存图片
fs.Close();
im0.Dispose();
im1.Dispose();
代码
public delegate string DelegateExam(int num);//在类外进行申明或者里面都行
private void button13_Click(object sender, EventArgs e)
{
DelegateExam de = new DelegateExam(DecD);
Console.WriteLine(de(33));//输出32
Console.WriteLine((new DelegateExam(AddD))(44));//输出45
}
private string AddD(int num)
{
return (num + 1).ToString();
}
private string DecD(int num)
{
return (num - 1).ToString();
}
Func<string, string> AA = delegate(string name)
{
name += "\nit's Nm";
return name;
};
Console.WriteLine(AA("111"));
没有委托的声明,直接用Func实现(可以查阅资料)
string mid = " it's middle ";
Func<string, string> lamda = para =>
{
para += "2333";
para += mid;
return para;
};
Console.WriteLine(lamda("GRY"));
lamda是函数名,para是参数,ide可以自动识别它的类型,而且此处Func已经为他指定类型了。=>
左边列出了其参数,右边是返回值,如果很长的话,用大括号括起来,如果不长的话,用以下方法也可以。
Func<double,double,double> Mult = (x,y) => (x*y);
Console.WriteLine(Mult(5,2));
参数用小括号括起来,右边直接写结果即可,不用大括号和return。
网址
网址
//线程类的创建
public class ThreadTest
{
public static void RunTestWithPara(object data)
{
Console.WriteLine("para is {0}",data);
}
}
//按钮响应事件
private void button21_Click(object sender, EventArgs e)
{
Thread[] th = new Thread[10];
for (int i = 0; i < 10; i++)
{
th[i] = new Thread(new ParameterizedThreadStart(ThreadTest.RunTestWithPara));
}
for (int i = 0; i < 10; i++)
{
th[i].Start(i);
}
}
注意:因为是线程启动,所以不是按照严格的递增的顺序输出0~9,每次运行时的输出顺序均不相同。
代码
List<string> list = new List<string>() {"list","ass","efrg","jhgkjs","jnbgt" };
var strWithJ = from a in list
where a.StartsWith("j")
orderby a ascending
select a;
foreach (var v in strWithJ)
Console.WriteLine(v);
Console.WriteLine("---------");
var strA = list.Where((a, index) => a.StartsWith("j") && index % 2 == 0);
foreach (var v in strA)
Console.WriteLine(v);
注:LINQ表达式是在每次运行foreach进行遍历时才执行搜索过程,因此执行foreach时,操作的是最新的对象。
var dd = from a in list
group a by a[0] into g
where g.Count() >= 1
select new
{
c11 = g.Key,
cnt = g.Count()
};
foreach (var ddd in dd)
{
Console.WriteLine("{0}---{1}",ddd.c11,ddd.cnt);
}
list.Add("jasld");
foreach (var ddd in dd)
{
Console.WriteLine("{0}---{1}", ddd.c11, ddd.cnt);
}
group关键词的操作
lookup和dictionary的操作
可以实现多级嵌套查询