public class person { public string name { get; set; } public int age { get; set; } }
program.cs代码如下: class program { //autoresetevent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。 //线程通过调用 autoresetevent 上的 waitone 来等待信号。如果 autoresetevent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程,通过调用 set 发出资源可用的信号。 //调用 set 向 autoresetevent 发信号以释放等待线程。autoresetevent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。 //可以通过将一个布尔值传递给构造函数来控制 autoresetevent 的初始状态,如果初始状态为终止状态,则为 true;否则为 false。 //通俗的来讲只有等myreseteven.set()成功运行后,myreseteven.waitone()才能够获得运行机会;set是发信号,waitone是等待信号,只有发了信号,等待的才会执行。如果不发的话,waitone后面的程序就永远不会执行。 private static autoresetevent autoset = new autoresetevent(false); private static list<person> list = new list<person>() { new person() {name = rose, age = 19}, new person() {name = steve, age = 45}, new person() {name = jessica, age = 20}, }; private static void main(string[] args) { //checkorders(); //common(); //removefromlist(); //exceptionhandling(); //----------------------------------------------------------------- //--------------------------------模拟非线程安全---------------------------- thread t1 = new thread(() => { //确保等待t2开始之后才运行下面的代码 autoset.waitone(); foreach (var item in list) { console.writeline(t1: + item.name); thread.sleep(1000); } }); t1.start(); thread t2 = new thread(() => { //通知t1可以执行代码 autoset.set(); //沉睡1秒是为了确保删除操作在t1的迭代过程中 thread.sleep(1000); list.removeat(2); }); t2.start(); console.readkey(); } public static void checkorders() { list<order> orders = new list<order>() { new order { id = 123, amount = 29.95m, customername = mark, status = delivered }, new order { id = 456, amount = 45.00m, customername = steph, status = refunded }, new order { id = 768, amount = 32.50m, customername = claire, status = delivered }, }; bool anyrefunded = orders.any(o => o.status == refunded); if (anyrefunded) { console.writeline(there are refunded orders); } else { console.writeline(no refunds); } bool alldelivered = orders.all(o => o.status == delivered); if (alldelivered) { console.writeline(everything was delivered); } else { console.writeline(not everything was delivered); } } public static void common() { //距离圣诞节的天数 var daystochristmas = (new datetime(datetime.today.year, 12, 25) - datetime.today).totaldays; console.writeline(daystochristmas); //----------------------------------------------------------------- int sum = 10,5,0,8,10,1,4,0,10,1 .split(',') .select(int.parse) .orderby(n => n) .skip(3) .sum(); console.writeline(sum); //----------------------------------------------------------------- var customers = new[] { new { name = annie, email = annie@test.com }, new { name = ben, email = }, new { name = lily, email = lily@test.com }, new { name = joel, email = joel@test.com }, new { name = sam, email = }, }; foreach (var customer in from c in customers where !string.isnullorempty(c.email) select c) { console.writeline(sending email to {0}, customer.name); } //效果同上 foreach (var customer in customers.where(c => !string.isnullorempty(c.email))) { console.writeline(sending email to {0}, customer.name); } } public static void removefromlist() { func<list<string>> makelist = () => enumerable.range(1, 10000000).select(n => (item + n + )).tolist(); var itemstoremove = new[] { item 0, item 1, item 50, item 1000, item 999999, item 9999999 }; var stopwatch = new stopwatch(); var list = makelist(); stopwatch.start(); foreach (var item in itemstoremove) { list.remove(item); } stopwatch.stop(); console.writeline(list.count + foreach took {0}ms, stopwatch.elapsedmilliseconds); list = makelist(); stopwatch.restart(); var newlist = list.except(itemstoremove).tolist(); //效率极低 stopwatch.stop(); console.writeline(newlist.count + except took {0}ms, stopwatch.elapsedmilliseconds); } public static void exceptionhandling() { var numbers = enumerable.range(1, 10) .select(n => 5 - n) .select(n => { try { return 10 / n; } catch (exception e) { console.writeline(error in lambda: + e.message); return -1; } }); foreach (var n in numbers) { console.writeline(n); } } }
以上就是分享一些高效的linq语句代码的详细内容。
