ใครบ้างมีรายการทั้งหมดของวิธีการขยาย LINQPad และวิธีการเช่น
.Dump()
SubmitChanges()
ใครบ้างมีรายการทั้งหมดของวิธีการขยาย LINQPad และวิธีการเช่น
.Dump()
SubmitChanges()
คำตอบ:
LinqPad กำหนดสองวิธีการขยาย (ใน LINQPad.Extensions) คือและDump()
เขียนไปที่หน้าต่างเอาต์พุตโดยใช้ฟอร์แมตเตอร์ของ LINQPad และโอเวอร์โหลดเพื่อให้คุณระบุหัวเรื่อง:Disassemble()
Dump()
typeof (int).Assembly.Dump ();
typeof (int).Assembly.Dump ("mscorlib");
คุณยังสามารถระบุความลึกการเรียกซ้ำสูงสุดเพื่อแทนที่ค่าเริ่มต้น 5 ระดับ:
typeof (int).Assembly.Dump (1); // Dump just one level deep
typeof (int).Assembly.Dump (7); // Dump 7 levels deep
typeof (int).Assembly.Dump ("mscorlib", 7); // Dump 7 levels deep with heading
Disassemble () แยกส่วนของเมธอดใด ๆ ไปที่IL
คืนค่าเอาต์พุตในสตริง:
typeof (Uri).GetMethod ("GetHashCode").Disassemble().Dump();
นอกจากวิธีการขยายสองวิธีเหล่านี้แล้วยังมีวิธีการแบบคงที่ที่มีประโยชน์ใน LINQPad อีกด้วย เอกสารเหล่านี้มีการเติมข้อความอัตโนมัติและรวมถึง:
LINQPad ยังมีคลาส HyperLinq นี่มีวัตถุประสงค์สองประการข้อแรกคือการแสดงไฮเปอร์ลิงก์สามัญ:
new Hyperlinq ("www.linqpad.net").Dump();
new Hyperlinq ("www.linqpad.net", "Web site").Dump();
new Hyperlinq ("mailto:user@domain.com", "Email").Dump();
คุณสามารถรวมสิ่งนี้กับUtil.HorizontalRun
:
Util.HorizontalRun (true,
"Check out",
new Hyperlinq ("http://stackoverflow.com", "this site"),
"for answers to programming questions.").Dump();
ผลลัพธ์:
ลองอ่านไซต์นี้เพื่อหาคำตอบสำหรับคำถามการเขียนโปรแกรม
วัตถุประสงค์ที่สองของ HyperLinq คือการสร้างแบบสอบถามแบบไดนามิก:
// Dynamically build simple expression:
new Hyperlinq (QueryLanguage.Expression, "123 * 234").Dump();
// Dynamically build query:
new Hyperlinq (QueryLanguage.Expression, @"from c in Customers
where c.Name.Length > 3
select c.Name", "Click to run!").Dump();
คุณยังสามารถเขียนวิธีการขยายของคุณเองใน LINQPad ไปที่ 'คำค้นหาของฉัน' และคลิกข้อความค้นหาที่เรียกว่า 'ส่วนขยายของฉัน' ประเภท / วิธีการใด ๆ ที่กำหนดไว้ที่นี่จะสามารถเข้าถึงการสืบค้นทั้งหมด:
void Main()
{
"hello".Pascal().Dump();
}
public static class MyExtensions
{
public static string Pascal (this string s)
{
return char.ToLower (s[0]) + s.Substring(1);
}
}
ใน 4.46 (.02) ชั้นเรียนและวิธีการใหม่ได้รับการแนะนำ :
นอกจากนี้คลาส Hyperlinq ยังรองรับตัวแทนActionที่จะถูกเรียกเมื่อคุณคลิกที่ลิงก์เพื่อให้คุณตอบสนองต่อมันในโค้ดและไม่ใช่แค่ลิงค์ไปยังเว็บเพจภายนอก
DumpContainer
เป็นคลาสที่เพิ่มบล็อกลงในหน้าต่างเอาต์พุตที่สามารถแทนที่เนื้อหาได้
บันทึก! อย่าลืมตัวเองอยู่ในจุดที่เหมาะสม.Dump()
DumpContainer
ใช้:
var dc = new DumpContainer();
dc.Content = "Test";
// further down in the code
dc.Content = "Another test";
OnDemand
เป็นวิธีการส่วนขยายที่จะไม่แสดงเนื้อหาของพารามิเตอร์ไปยังหน้าต่างเอาต์พุต แต่แทนที่จะเพิ่มลิงก์ที่คลิกได้ซึ่งเมื่อคลิกแล้วจะแทนที่ลิงก์ด้วย.Dump()
เนื้อหา ed ของพารามิเตอร์ สิ่งนี้เป็นสิ่งที่ดีสำหรับโครงสร้างข้อมูลที่จำเป็นในบางครั้งซึ่งมีค่าใช้จ่ายสูงหรือใช้พื้นที่มาก
บันทึก! จำ.Dump()
ผลลัพธ์ของการโทรOnDemand
ในจุดที่เหมาะสม
วิธีใช้:
Customers.OnDemand("Customers").Dump(); // description is optional
Util.ProgressBar
เป็นคลาสที่สามารถแสดงแถบความคืบหน้าแบบกราฟิกภายในหน้าต่างเอาต์พุตที่สามารถเปลี่ยนแปลงได้เมื่อโค้ดย้ายไป
บันทึก! อย่าลืม.Dump()
วัตถุ Util.ProgressBar ในจุดที่เหมาะสม
วิธีใช้:
var pb = new Util.ProgressBar("Analyzing data");
pb.Dump();
for (int index = 0; index <= 100; index++)
{
pb.Percent = index;
Thread.Sleep(100);
}
นอกเหนือจากที่รู้จักกันดีmyQuery.Dump("Query result:")
คุณลักษณะที่ต้องพูดถึงคือUtil
คลาส: มันมีวิธีการที่ค่อนข้างมีประโยชน์มากมาย (บางส่วนที่ฉันเคยพูดถึง แต่มีอีกมาก)
นอกจากนี้ที่น่าสนใจคือการที่คุณสามารถปรับเปลี่ยนวิธีDump()
การทำงาน
ในที่สุดฉันจะแสดงให้คุณเห็นว่าคุณสามารถทำการเปลี่ยนแปลงแบบถาวรได้อย่างไร (เช่นแทรกอัปเดตลบคำสั่ง LINQ) โดยใช้SubmitChanges()
หรือSaveChanges()
วิธีการเข้าถึงการเชื่อมต่อภายในวัตถุของ LinqPad
และเพื่อสรุปให้ดีขึ้นฉันจะแสดงให้คุณเห็นว่าคุณสามารถสร้างกราฟิก 2 มิติที่เรียบง่ายภายใน LinqPad ได้อย่างไร (วาดเส้นบิตแมปหรือฟังก์ชั่น )
ดังนั้นนี่คือคอลเลกชันของคุณสมบัติที่สร้างขึ้นใน LinqPad (จากประสบการณ์ของฉันเองด้วยเครื่องมือ):
(พารามิเตอร์ที่มีอยู่ใน LinqPad v5.03.08 ขึ้นไป)
ผู้ใช้ LinqPad ทุกคนรู้จักและชื่นชอบ.Dump()
วิธีการขยายซึ่งกินและพิมพ์ (เกือบ) ทุกอย่าง
แต่คุณรู้หรือไม่ว่ามีพารามิเตอร์สองสามตัวที่พร้อมใช้งาน ดูตัวอย่างรหัสนี้:
var obj=new { a="Hello", b=5, c="World", d=new { y=5, z=10 } };
obj.Dump(description: "1st example", depth: 5, toDataGrid: false, exclude: "b,d");
obj.Dump("2nd example", exclude: "a,c");
obj.Dump("2nd example", exclude: "+b,d"); // new in V5.06.06 beta
ตัวอย่างที่ 1พิมพ์เพียงตัวแปรa
และc
และกลองb
และd
ที่ตัวอย่างที่ 2ไม่ตรงข้าม (ทราบว่าจะระบุเพียง 2 ของพารามิเตอร์ที่มีอยู่) ตัวแปรy
และz
ไม่สามารถซ่อนได้ทีละตัวเพราะมันไม่ได้อยู่ในระดับสูงสุด
มีพารามิเตอร์ต่อไปนี้ ( ทั้งหมดเป็นตัวเลือก ):
description
[สตริง] - ให้คำอธิบายสำหรับวัตถุที่จะถ่ายโอนข้อมูลdepth
[int?] - จำกัด ความลึกของวัตถุที่ตรวจสอบซ้ำtoDataGrid
[บูล] - ถ้าเป็นจริงเอาต์พุตจะถูกจัดรูปแบบเป็นดาต้ากริดแทนที่จะเป็น RichTextexclude
[string] - หากคุณระบุรายการตัวแปรที่คั่นด้วยเครื่องหมายจุลภาคตัวแปรเหล่านั้นจะถูกแยกออกจากผลลัพธ์ (ในตัวอย่าง "a, c": b
และd
แสดงa
และc
ซ่อนอยู่)exclude
[string] ด้วยคำนำหน้า "+" - คำนำหน้ากลับค่าตรรกะของพารามิเตอร์แยก ซึ่งหมายความว่าหากคุณระบุรายการตัวแปรที่คั่นด้วยเครื่องหมายจุลภาคทั้งหมดยกเว้นตัวแปรที่ระบุจะถูกซ่อนไว้ (ในตัวอย่าง "+ b, d": b
และd
จะแสดงขึ้นมาซ่อนทั้งหมด)var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
.OnDemand("click me").Dump();
แทน.Dump()
จะแสดงลิงก์ที่คุณสามารถคลิกเพื่อขยาย มีประโยชน์หากคุณต้องการตรวจสอบค่าเช่นUtil.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump();
แสดง ID ต่อค่าเริ่มต้นเสมอ แต่เปิดเผยรายละเอียดcustomerObject
เฉพาะเมื่อคุณสนใจหัวข้อขั้นสูงเพิ่มเติมเกี่ยวกับการถ่ายโอนข้อมูลที่สามารถพบได้ที่นี่และมี
นี่ไม่ใช่ส่วนขยาย LinqPad แต่เป็นคลาส. NET แต่เนื่องจากมีประโยชน์ฉันจะพูดถึงมันต่อไป คุณสามารถรับข้อมูลที่เป็นประโยชน์มากมายที่คุณสามารถใช้ในสคริปต์ของคุณเช่น:
Environment.UserDomainName.Dump();
Environment.MachineName.Dump();
Environment.UserName.Dump();
Environment.CurrentDirectory.Dump();
Environment.SystemDirectory.Dump();
NBสำหรับการได้รับDomain\UserName
ผมจะใช้ มากกว่าSystem.Security.Principal.WindowsIdentity.GetCurrent().Name
Environment.UserDomainName+@"\"+Environment.UserName
( ใหม่:มีให้ตั้งแต่LinqPad เวอร์ชัน v4.45.05 (เบต้า) )
Util.WriteCsv (Customers, @"c:\temp\customers.csv");
นี้จะเขียนเนื้อหาของตารางไปยังไฟล์รูปแบบCustomers
CSV c:\temp\customers.csv
นอกจากนี้คุณยังสามารถหาตัวอย่างที่ดีวิธีการใช้งานUtil.WriteCsv
และแสดงข้อมูล CSV ในหน้าต่างผล LinqPad ของที่นี่
คำแนะนำ:
ในการรับ / สร้างไฟล์ CSV ซึ่งอยู่ในไดเรกทอรีเดียวกับแบบสอบถามคุณสามารถใช้:
var csvFile=Util.CurrentQueryPath.Replace(".linq", ".csv");
หากตารางมีขนาดใหญ่ใช้ObjectTrackingEnabled = false;
ก่อนที่คุณจะเขียน CSV เพื่อหลีกเลี่ยงการแคชในหน่วยความจำ
หากคุณต้องการส่งออกตารางในรูปแบบ XMLแทนที่จะเป็นไฟล์ที่คั่นด้วยเครื่องหมายจุลภาคคุณสามารถทำได้เช่น:
var xmlFile=Util.CurrentQueryPath.Replace(".linq", ".xml");
var xml = XElement.Load(xmlFile);
var query =
from e in xml.Elements()
where e.Attribute("attr1").Value == "a"
select e;
query.Dump();
ตัวอย่างนี้ส่งคืนองค์ประกอบทั้งหมดที่มีแอททริบิวต์attr1
ซึ่งมีค่า"a"
จากไฟล์ XML ซึ่งมีชื่อเหมือนกับเคียวรีและอยู่ในพา ธ เดียวกัน ลองดูลิงค์นี้สำหรับตัวอย่างโค้ดเพิ่มเติม
var pwd = Util.GetPassword("UserXY");
สิ่งนี้จะดึงรหัสผ่านจากตัวจัดการรหัสผ่านของ LinqPad ในการสร้างและเปลี่ยนรหัสผ่านให้เปิด"ผู้จัดการรหัสผ่าน" รายการเมนูในเมนู "แฟ้ม"ของ LinqPad หากไม่มีการบันทึกรหัสผ่านเมื่อคุณเรียกใช้รหัส C # กล่องโต้ตอบรหัสผ่านจะเปิดขึ้นเพื่อขอรหัสผ่านจากคุณและคุณมีทางเลือกในการสร้างและบันทึกรหัสผ่านได้ทันทีโดยทำเครื่องหมายในช่องทำเครื่องหมายบันทึกรหัสผ่าน (ในตัวอย่างรหัสผ่าน สำหรับ "UserXY" จะถูกบันทึกและหลังจากนั้นคุณสามารถค้นหารายการนี้ได้ในเครื่องมือจัดการรหัสผ่าน )
ข้อดีคือคุณสามารถจัดเก็บรหัสผ่านใน LinqScripts ที่คุณสร้างอย่างปลอดภัยแยกต่างหากและเข้ารหัสในโปรไฟล์ผู้ใช้ของ Windows (มันถูกเก็บไว้ใน%localappdata%\LINQPad\Passwords
รูปแบบไฟล์) LinqPad ใช้ Windows DPAPI เพื่อป้องกันรหัสผ่าน
รหัสผ่านจะถูกเก็บไว้ที่ส่วนกลางดังนั้นหากคุณต้องการเปลี่ยนคุณสามารถทำได้ในเมนูและใช้กับสคริปต์ทั้งหมดที่คุณสร้างทันที
หมายเหตุ:
หากคุณไม่ต้องการบันทึกรหัสผ่านและเปิดกล่องโต้ตอบรหัสผ่านคุณสามารถใช้พารามิเตอร์ที่ 2 ดังนี้:
var pwd = Util.GetPassword("UserXY", true);
นี่จะเป็นการยกเลิกการเลือกช่องทำเครื่องหมายบันทึกรหัสผ่านในกล่องโต้ตอบรหัสผ่าน (อย่างไรก็ตามผู้ใช้ยังสามารถตรวจสอบได้และ เลือกที่จะบันทึกต่อไป)
หากคุณจำเป็นต้องใช้รหัสผ่านที่จะเก็บไว้ในที่SecureString
คุณสามารถใช้ฟังก์ชั่นผู้ช่วยนี้ (หมายเหตุ: ที่จะได้รับวิธีการขยาย.ToSecureString()
ใช้โปรดทำตามลิงค์นี้ที่ Stackoverflow - นอกจากนี้ยังช่วยให้คุณสามารถแปลงกลับถ้าจำเป็น):
System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
{
return Util.GetPassword(Name, noDefaultSave)
.ToSecureString();
}
วิธีนี้ใช้งานได้เหมือนกับตัวประมวลผลคำสั่ง คุณสามารถเรียกใช้คำสั่งทั้งหมดที่คุณรู้จักจากคอนโซล Windows
ตัวอย่างที่ 1 - dir:
Util.Cmd(@"dir C:\");
สิ่งนี้จะเอาท์พุทผลลัพธ์ของไดเรกทอรีโดยไม่จำเป็นต้องใช้.Dump
มัน การเก็บไว้ในตัวแปรมีข้อดีที่คุณสามารถใช้การสอบถามเพิ่มเติมของ Linq ตัวอย่างเช่น:
var path=@"C:\windows\system32";
var dirSwitch="/s/b";
var x=Util.Cmd(String.Format(@"dir ""{0}"" {1}", path, dirSwitch), true);
var q=from d in x
where d.Contains(".exe") || d.Contains(".dll")
orderby d
select d;
q.Dump();
นี้จะถ่ายโอนไฟล์ทั้งหมดที่มีนามสกุลไฟล์ ".exe" หรือ ".dll" C:\windows\system32
ที่มีอยู่ใน /s
สวิทช์ที่ใช้ในการ recurse ไดเรกทอรีย่อยทั้งหมดและ/b
จะใช้สำหรับรูปแบบการออกเปลือย โปรดสังเกตว่าพารามิเตอร์ที่สองของวิธี Cmd ถูกระบุเพื่อระงับเอาต์พุตคอนโซลเพื่อแสดงเฉพาะผลลัพธ์ที่กรองแล้วโดยใช้วิธีการถ่ายโอนข้อมูล
คุณสามารถเห็นได้ว่านี่คือความยืดหยุ่นมากกว่าไวด์การ์ดที่คุณมีdir
เนื่องจากคุณสามารถใช้ความยืดหยุ่นเต็มรูปแบบของเคียวรีของ Linq
ตัวอย่างที่ 2 - โปรแกรมแก้ไขข้อความ:
คุณสามารถเปิดไฟล์ใน Notepad แบบนี้:
var filePath=@"C:\HelloWorld.txt";
Util.Cmd(@"%systemroot%\system32\notepad.exe", filePath);
แสดงภาพจาก URL ตัวอย่าง:
var url = "http://chart.apis.google.com/chart?cht=p3&chd=s:Uf9a&chs=350x140&chl=January|February|March|April";
Util.Image(url).Dump();
การใช้Util.ProgressBar
ช่วยให้คุณแสดงแถบความคืบหน้า คุณสามารถใช้คลาสตัวช่วยต่อไปนี้:
public class ProgressBar
{
Util.ProgressBar prog;
public ProgressBar()
{
Init("Processing");
}
private void Init(string msg)
{
prog = new Util.ProgressBar (msg).Dump();
prog.Percent=0;
}
public void Update(int percent)
{
Update(percent, null);
}
public void Update(int percent, string msg)
{
prog.Percent=percent;
if (String.IsNullOrEmpty(msg))
{
if (percent>99) prog.Caption="Done.";
}
else
{
prog.Caption=msg;
}
}
}
เพียงใช้มันตามตัวอย่างต่อไปนี้แสดง:
void Main()
{
var pb1= new ProgressBar();
Thread.Sleep(50);
pb1.Update(50, "Doing something"); Thread.Sleep(550);
pb1.Update(100); Thread.Sleep(50);
}
คุณสามารถใช้Util.Progress
เพื่ออัปเดตแถบความคืบหน้าแบบรวมของ LinqPads ได้เช่น:
Util.Progress = 25; // 25 percent complete
ข้อแตกต่างคือมันจะไม่แสดงในหน้าต่างผลลัพธ์และคุณไม่สามารถกำหนดข้อความให้กับมันได้
แสดง HTML ในหน้าต่างเอาต์พุต ตัวอย่าง:
Util.RawHtml (new XElement ("h1", "This is a big heading")).Dump();
คุณสามารถใช้ฟังก์ชั่นตัวอย่างนี้
public void ShowUrl(string strURL, string Title)
{
Action showURL = delegate() { Process.Start("iexplore.exe", strURL); };
var url = new Hyperlinq(showURL, "this link", true);
Util.HorizontalRun (true, "Click ", url, " for details.").Dump(Title);
}
เพื่อแสดงการเชื่อมโยงหลายมิติในหน้าต่างผลลัพธ์ - หรือการกระทำใด ๆ เช่นการเปิดโปรแกรมแก้ไขรายการโปรดของคุณ การใช้งาน:
ShowUrl("http://stackoverflow.com", "Check out StackOverflow");
โปรดทราบว่าฟังก์ชั่นนี้ใช้งานได้ทุกเมื่อในขณะที่ใช้new Hyperlinq ("http://myURL", "Web site").Dump();
ไม่ได้กับ URL บางประเภท (โดยเฉพาะถ้าคุณต้องส่งชื่อพอร์ตเช่น ": 1234" ซึ่งเป็นส่วนหนึ่งของ URL)
อ่านอินพุตจากคอนโซล ตัวอย่าง:
int age = Util.ReadLine<int> ("Enter your age");
เป็นคำพ้องสำหรับUtil.ReadLine<string>()
คุณสามารถใช้Console.ReadLine()
เช่นกัน
แต่มีอีกมาก! คุณสามารถสร้างตัวแยกวิเคราะห์ JSON อย่างง่ายด้วยตัวอย่างต่อไปนี้ - มีประโยชน์มากตัวอย่างเช่นถ้าคุณต้องการแยกวิเคราะห์และทดสอบสตริง JSON ได้ทันที บันทึกตัวอย่างต่อไปนี้เป็นJSONAnalyzer.linqโดยใช้เท็กซ์เอดิเตอร์แล้วเปิดใน LinqPad (นี่เป็นการเพิ่มการอ้างอิงได้อย่างง่ายดายในทันที):
<Query Kind="Program">
<Reference><RuntimeDirectory>\System.Web.Extensions.dll</Reference>
<Namespace>System.Web.Script.Serialization</Namespace>
</Query>
void Main()
{
var jsonData=Util.ReadLine<string>("Enter JSON string:");
var jsonAsObject = new JavaScriptSerializer().Deserialize<object>(jsonData);
jsonAsObject.Dump("Deserialized JSON");
}
ตอนนี้คุณสามารถรันและวางสตริง JSON จากคลิปบอร์ดลงในคอนโซล - มันจะใช้Dump
ฟังก์ชั่นเพื่อแสดงมันเป็นวัตถุอย่าง - และคุณยังได้รับข้อความแสดงข้อผิดพลาดของ parser บนหน้าจอเพื่อแก้ไขปัญหา มีประโยชน์มากสำหรับการดีบัก AJAX
หากคุณต้องการล้างหน้าต่างผลลัพธ์ภายในสคริปต์ของคุณให้ใช้:
Util.ClearResults();
ใช้มันที่ด้านบนสุดของสคริปต์ของคุณหรือ - ถ้าคุณกำลังเรียกใช้หลาย ๆ คำสั่งในสคริปต์ - คุณควรรอให้ผู้ใช้ป้อนข้อมูลก่อนที่จะทำให้หน้าจอว่างเปล่า (เช่นนำหน้าด้วยUtil.ReadLine
)
ที่น่าสนใจก็คือคุณสามารถเปลี่ยนผลลัพธ์ของ.Dump()
วิธีการได้ เพียงใช้ส่วนต่อประสานICustomMemberProvider
เช่น
public class test : ICustomMemberProvider
{
IEnumerable<string> ICustomMemberProvider.GetNames() {
return new List<string>{"Hint", "constMember1", "constMember2", "myprop"};
}
IEnumerable<Type> ICustomMemberProvider.GetTypes()
{
return new List<Type>{typeof(string), typeof(string[]),
typeof(string), typeof(string)};
}
IEnumerable<object> ICustomMemberProvider.GetValues()
{
return new List<object>{
"This class contains custom properties for .Dump()",
new string[]{"A", "B", "C"}, "blabla", abc};
}
public string abc = "Hello1"; // abc is shown as "myprop"
public string xyz = "Hello2"; // xyz is entirely hidden
}
ถ้าคุณสร้างตัวอย่างของคลาสนี้เช่น
var obj1 = new test();
obj1.Dump("Test");
แล้วมันจะออกเพียงHint
, constMember1
, constMember2
และmyprop
แต่ไม่ได้ทรัพย์สินxyz
:
หากคุณต้องการแสดงกล่องข้อความให้ดูที่นี่วิธีการทำ
ตัวอย่างเช่นคุณสามารถแสดง InputBox โดยใช้รหัสต่อไปนี้
void Main()
{
string inputValue="John Doe";
inputValue=Interaction.InputBox("Enter user name", "Query", inputValue);
if (!string.IsNullOrEmpty(inputValue)) // not cancelled and value entered
{
inputValue.Dump("You have entered;"); // either display it in results window
Interaction.MsgBox(inputValue, MsgBoxStyle.OkOnly, "Result"); // or as MsgBox
}
}
(อย่าลืมกด F4 และเพิ่ม Microsoft.VisualBasic.dll และเนมสเปซเพื่อให้ใช้งานได้)
( ใหม่:มีให้ตั้งแต่LinqPad เวอร์ชัน v4.52.1 (เบต้า) )
ช่วยให้คุณเรียกใช้สคริปต์ LINQPad อื่นจากภายในสคริปต์ของคุณหรือภายในโปรแกรม. NET หรือบริการ Windows ของคุณ (โดยอ้างอิงรุ่น LINQPad4-AnyCPU ของLINQPad.exe
) มันรันสคริปต์เช่นเดียวกับเครื่องมือบรรทัดคำสั่งlprun.exe
จะทำมัน
ตัวอย่าง:
const string path=@"C:\myScripts\LinqPad\";
var dummy=new LINQPad.QueryResultFormat(); // needed to call Util.Run
Util.Run(path+"foo.linq", dummy);
ตัวอย่างนี้เรียกใช้สคริปต์foo.linq
ซึ่งมีตัวอย่างรหัสต่อไปนี้:
void Main(string[] args)
{
#if CMD
"I'm been called from lprun! (command line)".Dump();
#else
"I'm running in the LINQPad GUI!".Dump();
args = new[] { "testhost", "test@foo.com", "test@foo.com", "Test Subject" };
#endif
args.Dump("Args");
}
จะช่วยให้คุณตรวจสอบว่าสคริปต์ที่ถูกเรียกใช้จากภายใน LinqPad GUI หรือผ่านทางหรือlprun.exe
Util.Run
หมายเหตุ:ตัวแปรของการเรียกใช้ต่อไปนี้อาจมีประโยชน์:
Util.Run(path+"foo.linq", dummy).Dump(); // obviously dumps the script output!
Util.Run(path+"foo.linq", dummy).Save(path+"foo.log"); // writes output into log
Util.Run(path+"foo.linq", dummy).SaveAsync(path+"foo1.log"); // async output log
หากคุณใช้LinqToSQLคุณอาจต้องการเปลี่ยนแปลงอย่างถาวร (สำหรับการดำเนินการแทรก / อัปเดต / ลบ ) เนื่องจากบริบทฐานข้อมูลถูกสร้างขึ้นโดย LinqPad คุณต้องโทร SubmitChanges()
หลังจากการเปลี่ยนแปลงแต่ละครั้งดังที่แสดงด้านล่าง
ตัวอย่างสำหรับ(LinqPad-)ฐานข้อมูลNorthwind :
แทรก
var newP = new Products() { ProductID=pID, CategoryID=cID,
ProductName="Salmon#"+pID.ToString() };
Products.InsertOnSubmit(newP);
SubmitChanges();
ปรับปรุง
var prod=(from p in Products
where p.ProductName.Contains("Salmon")
select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
SubmitChanges();
ลบ
var itemsToDelete=Products.Where(p=> p.ProductName.Contains("Salmon") ||
p.ProductName.Contains("Trout"));
foreach(var item in itemsToDelete) { Products.DeleteOnSubmit(item); }
SubmitChanges();
หมายเหตุ:เพื่อรับ ID ที่ถูกต้องสำหรับตัวอย่างก่อนหน้านี้คุณสามารถใช้:
var cID = (from c in Categories
where c.CategoryName.Contains("Seafood")
select c).FirstOrDefault().CategoryID;
var pID = Products.Count()+1;
ก่อนที่คุณจะเรียกใช้พวกเขา
หากคุณใช้Entity Frameworkคุณอาจต้องการทำการเปลี่ยนแปลงอย่างถาวรเช่นกัน (สำหรับการดำเนินการแทรก / อัปเดต / ลบ ) เนื่องจากบริบทฐานข้อมูลถูกสร้างขึ้นโดย LinqPad คุณต้องโทร SaveChanges()
หลังจากการเปลี่ยนแปลงแต่ละครั้งดังที่แสดงด้านล่าง
ตัวอย่างนั้นเป็นแบบเดียวกับก่อนหน้านี้สำหรับLinqToSQLแต่คุณต้องใช้SaveChanges()
แทนและสำหรับการแทรกและการลบวิธีก็เปลี่ยนไปเช่นกัน
แทรก
var newP = new Products() { ProductID=pID, CategoryID=cID,
ProductName="Salmon#"+pID.ToString() };
Products.Add(newP);
SaveChanges();
ปรับปรุง
var prod=(from p in Products
where p.ProductName.Contains("Salmon")
select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
SaveChanges();
ลบ
var itemsToDelete=Products.Where(p=> p.ProductName.Contains("Salmon") ||
p.ProductName.Contains("Trout"));
foreach(var item in itemsToDelete) { Products.Remove(item); }
SaveChanges();
หมายเหตุ:เพื่อรับ ID ที่ถูกต้องสำหรับตัวอย่างก่อนหน้านี้คุณสามารถใช้:
var cID = (from c in Categories
where c.CategoryName.Contains("Seafood")
select c).FirstOrDefault().CategoryID;
var pID = Products.Count()+1;
ก่อนที่คุณจะเรียกใช้พวกเขา
ในLinqPadที่บริบทของฐานข้อมูลถูกนำไปใช้โดยอัตโนมัติโดยใช้ ComboBox ที่ด้านบนและเก็บฐานข้อมูลที่เหมาะสมสำหรับการค้นหาของคุณ แต่บางครั้งมีประโยชน์ในการอ้างอิงอย่างชัดเจนตัวอย่างเช่นหากคุณคัดลอกโค้ดบางส่วนจากโครงการของคุณออกจากVisual Studioและวางลงใน LinqPad
ข้อมูลโค้ดของคุณที่นำมาจากโครงการ Visual Studio มีแนวโน้มว่าจะเป็นดังนี้:
var prod=(from p in dc.Products
where p.ProductName.Contains("Salmon")
select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
dc.SaveChanges();
ตอนนี้จะทำอย่างไรกับdc
? แน่นอนคุณสามารถลบการเกิดขึ้นแต่ละครั้งdc.
ในการสืบค้นของคุณ แต่จะง่ายกว่ามาก เพียงเพิ่ม
var dc=this; // UserQuery
ไปที่ด้านบนสุดของตัวอย่างเช่น:
void Main()
{
var dc=this;
var prod=(from p in dc.Products
where p.ProductName.Contains("Salmon")
select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
dc.SaveChanges();
}
และรหัสจะทำงานทันที!
ใช้ LinqPad กับ OleDb แปลงข้อมูลเป็นวัตถุ Linq แบบสอบถาม SQL ใน Linq
ข้อมูลโค้ดต่อไปนี้ช่วยให้คุณใช้ LinqPad กับ OleDb เพิ่มSystem.Data.OleDb
จากSystem.Data
แอสเซมบลีไปยังคุณสมบัติแบบสอบถามแล้ววางรหัสต่อไปนี้ลงในMain()
:
var connStr="Provider=SQLOLEDB.1;"+this.Connection.ConnectionString;
OleDbConnection conn = new OleDbConnection(connStr);
DataSet myDS = new DataSet();
conn.Open();
string sql = @"SELECT * from Customers";
OleDbDataAdapter adpt = new OleDbDataAdapter();
adpt.SelectCommand = new OleDbCommand(sql, conn);
adpt.Fill(myDS);
myDS.Dump();
ตอนนี้เพิ่มการเชื่อมต่อ SqlServer ไปยัง LinqPad และเพิ่มฐานข้อมูล Northwind เพื่อเรียกใช้ตัวอย่างนี้
หมายเหตุ:หากคุณต้องการรับฐานข้อมูลและเซิร์ฟเวอร์ของการเชื่อมต่อที่เลือกในปัจจุบันคุณสามารถใช้ข้อมูลโค้ดนี้:
void Main()
{
var dc=this;
var tgtSrv=dc.Connection.DataSource;
var tgtDb=dc.Connection.ConnectionString.Split(';').Select(s=>s.Trim())
.Where(x=>x.StartsWith("initial catalog", StringComparison.InvariantCultureIgnoreCase))
.ToArray()[0].Split('=')[1];
tgtSrv.Dump();
tgtDb.Dump();
}
คุณยังสามารถแปลงmyDS
เป็นLinqคำตอบของคำถามต่อไปนี้แสดงให้เห็นถึงวิธีการทำ: ตัวอย่างที่ดีของการใช้. NET 4 dynamic keyword กับ Linq
อีกตัวอย่างหนึ่ง: สมมติว่า DBA ของคุณให้คำสืบค้น SQL และคุณต้องการวิเคราะห์ผลลัพธ์ใน LinqPad - แน่นอนใน Linq ไม่ใช่ใน SQL จากนั้นคุณสามารถทำสิ่งต่อไปนี้:
void Main()
{
var dc=this;
// do the SQL query
var cmd =
"SELECT Orders.OrderID, Orders.CustomerID, Customers.CompanyName,"
+" Customers.Address, Customers.City"
+" FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID";
var results = dc.ExecuteQuery<OrderResult>(cmd);
// just get the cities back, ordered ascending
results.Select(x=>x.City).Distinct().OrderBy(x=>x).Dump();
}
class OrderResult
{ // put here all the fields you're returning from the SELECT
public dynamic OrderID=null;
public dynamic CustomerID=null;
public dynamic CompanyName=null;
public dynamic Address=null;
public dynamic City=null;
}
ในตัวอย่างนี้เคียวรี SELECT ของ DBA เป็นเพียง "โยนลงไปใน" ข้อความคำสั่งและผลลัพธ์จะถูกกรองและเรียงลำดับโดย City
แน่นอนว่านี่เป็นตัวอย่างแบบง่าย ๆ DBA ของคุณอาจให้สคริปต์ที่ซับซ้อนมากขึ้น แต่คุณได้รับแนวคิด: เพียงเพิ่มคลาสผลการสนับสนุนที่มีฟิลด์ทั้งหมดจากส่วนคำสั่ง SELECT และจากนั้นคุณสามารถใช้งานได้โดยตรง .
คุณยังสามารถรับผลจากขั้นตอนการจัดเก็บด้วยวิธีนี้และใช้ใน Linq อย่างที่คุณเห็นในตัวอย่างนี้ฉันไม่สนใจชนิดข้อมูลและการใช้งานdynamic
เพื่อแสดงมัน
ดังนั้นนี่คือการเขียนโปรแกรมที่รวดเร็วเพื่อให้สามารถวิเคราะห์ข้อมูลได้อย่างรวดเร็ว คุณไม่ควรทำสิ่งนี้ในแอปพลิเคชันจริงของคุณด้วยเหตุผลหลาย ๆ อย่าง (การฉีด SQL เนื่องจากคุณสามารถใช้ EF ได้ตั้งแต่ต้นเป็นต้น)
วาดกราฟิคใน LinqPad ตอนที่ 1
ที่จะใช้ตัวอย่างด้านล่างให้กดF4และเพิ่มSystem.Windows.dll
, System.Windows.Forms.dll
, WindowsFormsIntegration.dll
, PresentationCore.dll
และPresentationFramework.dll
โปรแกรม LinqPad ของคุณและยังเพิ่มการ System.Windows.Shapes
namespace
ตัวอย่างที่ 1เพียงแค่ดึงบรรทัด:
var myLine = new Line();
myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
myLine.X1 = 1; myLine.X2 = 50;
myLine.Y1 = 1; myLine.Y2 = 50;
myLine.StrokeThickness = 2;
PanelManager.DisplayWpfElement(myLine, "Graphic");
ตัวอย่างที่ 2แสดงให้เห็นว่าคุณสามารถแสดงกราฟิกใน LinqPad โดยใช้ PanelManager ปกติ LinqPad รองรับวัตถุ Wpf เท่านั้น ตัวอย่างนี้ใช้System.Windows.Forms.Integration.WindowsFormsHost
เพื่อให้Windows.Forms.PictureBox
พร้อมใช้งาน (ซึ่งได้รับแรงบันดาลใจจากสิ่งนี้ ):
// needs (F4): System.Windows.dll, System.Windows.Forms.dll,
// WindowsFormsIntegration.dll, PresentationCore.dll, PresentationFramework.dll
void Main()
{
var wfHost1 = new System.Windows.Forms.Integration.WindowsFormsHost();
wfHost1.Height=175; wfHost1.Width=175; wfHost1.Name="Picturebox1";
wfHost1.HorizontalAlignment=System.Windows.HorizontalAlignment.Left;
wfHost1.VerticalAlignment=System.Windows.VerticalAlignment.Top;
System.Windows.Forms.PictureBox pBox1 = new System.Windows.Forms.PictureBox();
wfHost1.Child = pBox1;
pBox1.Paint += new System.Windows.Forms.PaintEventHandler(picturebox1_Paint);
PanelManager.StackWpfElement(wfHost1, "Picture");
}
public string pathImg
{
get { return System.IO.Path.Combine(@"C:\Users\Public\Pictures\Sample Pictures\",
"Tulips.jpg"); }
}
// Define other methods and classes here
public void picturebox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
// https://stackoverflow.com/a/14143574/1016343
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(pathImg);
System.Drawing.Point ulPoint = new System.Drawing.Point(0, 0);
e.Graphics.DrawImage(bmp, ulPoint.X, ulPoint.Y, 175, 175);
}
สิ่งนี้จะสร้างกราฟิกต่อไปนี้ (เพิ่มรายการตัวอย่าง "กราฟิก" และ "รูปภาพ" ตามตัวอย่างด้านบน):
หากคุณต้องการแสดงภาพจากฐานข้อมูล Northwindคุณสามารถทำสิ่งต่อไปนี้:
เปลี่ยนชื่อไฟล์ภาพเป็น "NorthwindPics.jpg" จากนั้นเพิ่มรหัสต่อไปนี้ที่จุดเริ่มต้นของวิธีการหลัก () ตัวอย่างที่ 2 :
var img = (from e in this.Employees select e).FirstOrDefault().Photo.ToArray();
using (FileStream fs1 = new FileStream(pathImg, FileMode.Create))
{
const int offset=78;
fs1.Write(img, offset, img.Length-offset);
fs1.Close();
}
มันจะอ่านบันทึกแรกจากตารางพนักงานและแสดงภาพ
ตรวจสอบลิงค์ต่อไปนี้เพื่อค้นหาเพิ่มเติม:
รูปร่างและการวาดภาพพื้นฐานใน VisualFic Customizer WPF
LinqPad
หมายเหตุ:คุณสามารถทำได้โดยไม่ต้องใช้ PanelManager เช่นเดียวกับตัวอย่างต่อไปนี้ซึ่งฉันเห็นที่นี่แสดงให้เห็น:
// using System.Drawing;
using (var image=new Bitmap(100, 100))
using (var gr = Graphics.FromImage(image))
{
gr.FillRectangle(Brushes.Gold, 0, 0, 100, 100);
gr.DrawEllipse(Pens.Blue, 5, 5, 90, 90);
gr.Save();
image.Dump();
}
มันใช้.Dump()
คำสั่งเพื่อแสดงมัน คุณสามารถเรียกใช้image.Dump()
หลายครั้งและมันจะผนวกภาพ
วาดกราฟิคใน LinqPad ตอนที่ 2
ตัวอย่างต่อไปนี้แรงบันดาลใจจากนี้โพสต์จะแสดงวิธีการใช้ฟังก์ชั่นล็อตเตอร์ที่เรียบง่ายใน LinqPad 5 ใช้ C # 7:
void Main()
{
fnPlotter(x1: -1, x2: 1, fn: (double x) => Math.Pow(x, 3)).Dump();
}
public static Bitmap fnPlotter(double x1=-3, double x2=3, double s=0.05,
double? ymin=null, double? ymax=null,
Func<double, double> fn = null, bool enable3D=true)
{
ymin = ymin ?? x1; ymax = ymax ?? x2;
dynamic fArrPair(double p_x1 = -3, double p_x2 = 3, double p_s = 0.01,
Func<double, double> p_fn = null)
{
if (p_fn == null) p_fn = ((xf) => { return xf; }); // identity as default
var xl = new List<double>(); var yl = new List<double>();
for (var x = p_x1; x <= p_x2; x += p_s)
{
double? f = null;
try { f = p_fn(x); }
finally
{
if (f.HasValue) { xl.Add(x); yl.Add(f.Value); }
}
}
return new { Xs = xl.ToArray(), Ys = yl.ToArray() };
}
var chrt = new Chart(); var ca = new ChartArea(); chrt.ChartAreas.Add(ca);
ca.Area3DStyle.Enable3D = enable3D;
ca.AxisX.Minimum = x1; ca.AxisX.Maximum = x2;
ca.AxisY.Minimum = ymin.Value; ca.AxisY.Maximum = ymax.Value;
var sr = new Series(); chrt.Series.Add(sr);
sr.ChartType = SeriesChartType.Spline; sr.Color = Color.Red;
sr.MarkerColor = Color.Blue; sr.MarkerStyle = MarkerStyle.Circle;
sr.MarkerSize = 2;
var data = fArrPair(x1, x2, s, fn); sr.Points.DataBindXY(data.Xs, data.Ys);
var bm = new Bitmap(width: chrt.Width, height: chrt.Height);
chrt.DrawToBitmap(bm, chrt.Bounds); return bm;
}
ใช้ความสามารถของ LinqPad ในการแสดงแบบฟอร์ม Windows ในแผงผลลัพธ์
เพิ่มการอ้างอิง (กด) : , , และเพิ่ม namespaces ทั้งหมดจากผู้ประกอบการเหล่านี้
F4
System.Drawing.dll
System.Windows.Forms.dll
System.Windows.Forms.DataVisualization.dll
คำแนะนำเพิ่มเติม / อ่านเพิ่มเติม:
ต้องการใช้ LinqPad ในVisual Studioหรือไม่ นี่คือวิธีการที่คุณสามารถทำเช่นนั้น
จำเป็นต้องมี LinqPad เป็น"แอพพกพา"หรือไม่? อ่านที่นี่วิธีการทำ
เว็บไซต์ของ Joe สำหรับLinqPadนั้นเป็นแหล่งข้อมูลที่ยอดเยี่ยมเสมอ ภายใน LinqPadHelp -> What's New
ให้คำแนะนำเกี่ยวกับฟังก์ชั่นและวิธีการใหม่ ๆ LinqPad ฟอรั่มนอกจากนี้ยังมีคำแนะนำที่เป็นประโยชน์
ยังมีประโยชน์มาก: นี้บทความเกี่ยวกับ Linq (Pad) การแก้จุดบกพร่อง
ใช้lprun.exe
สำหรับเรียกใช้แบบสอบถาม LINQในสคริปต์ชุดงานของคุณ อ่านบทความนี้สำหรับรายละเอียดเพิ่มเติม ตัวอย่างเช่น:
echo Customers.Take(100) > script.txt
lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
ในตัวอย่างนี้แบบสอบถามเป็นนิพจน์ LINQ อย่างง่าย แน่นอนคุณสามารถจัดทำแบบสอบถามที่ซับซ้อนเช่นเดียวกับการใช้-lang=program
เพื่อเปิดใช้งานโหมดโปรแกรม
คุณสามารถเขียนวิธีการขยายและเก็บไว้ในแบบสอบถามของฉันแท็บทางด้านซ้ายมือของ LinqPad: รายการสุดท้ายของต้นไม้เป็นชื่อที่ตั้งส่วนขยายของฉัน ; คลิกสองครั้งที่ไฟล์นั้นเพื่อเปิดไฟล์ที่คุณสามารถเขียนส่วนขยายที่มีให้สำหรับทุกข้อสงสัย เพียงแค่ใส่พวกเขาลงในชั้นคงที่สาธารณะMyExtensions
และใช้Main()
วิธีการรวมการทดสอบสำหรับส่วนขยายของคุณ
การถ่ายโอนข้อมูลเป็นวิธีการขยายส่วนกลางและ SubmitChanges มาจากวัตถุ DataContext ซึ่งเป็นวัตถุ System.Data.Linq.DataContext
LP เพิ่มเฉพาะการถ่ายโอนข้อมูลและการถอดเท่าที่ฉันทราบ แม้ว่าฉันจะขอแนะนำให้เปิดใน Reflector เพื่อดูว่ามีอะไรอีกบ้างที่สามารถใช้ได้ สิ่งที่น่าสนใจอีกอย่างหนึ่งคือ LINQPad.Util namespace ซึ่งมีสารพัดบางอย่างที่ใช้โดย LINQPad ภายใน
.Dump()
หรือวิธีอื่นใดในตัวแก้ไขซอร์สกดF12 เพื่อ "สะท้อน" ตอนนี้มีอยู่แล้วภายในเครื่องมือ!
ถึงขีด จำกัด ข้อความ StackOverflowในคำตอบก่อนหน้าของฉันแต่ยังมีส่วนขยายที่น่าสนใจใน LinqPad หนึ่งในนั้นที่ฉันต้องการพูดถึง:
.Dump()
)ตั้งแต่เวอร์ชัน5.42 เบต้าของ LinqPad คุณสามารถฝังฟังก์ชั่น JavaScript และเรียกใช้โดยตรงจากรหัส C # ของคุณ แม้ว่าจะมีข้อ จำกัด บางอย่าง (เมื่อเทียบกับ JSFiddle) แต่ก็เป็นวิธีที่ดีในการทดสอบโค้ด JavaScript ใน LinqPad อย่างรวดเร็ว
ตัวอย่าง:
void Main()
{
// JavaScript inside C#
var literal = new LINQPad.Controls.Literal("script",
@"function jsFoo(x) {
alert('jsFoo got parameter: ' + x);
var a = ['x', 'y', 'z']; external.log('Fetched \'' + a.pop() + '\' from Stack');
external.log('message from C#: \'' + x + '\'');
}");
// render & invoke
literal.Dump().HtmlElement.InvokeScript(true, "jsFoo", "testparam");
}
ในตัวอย่างนี้ฟังก์ชั่นที่มีพารามิเตอร์หนึ่งคือการจัดทำและเก็บไว้ในตัวแปรjsFoo
literal
จากนั้นก็มีการแสดงและเรียกร้องผ่านทางผ่านพารามิเตอร์.Dump().HtmlElement.InvokeScript(...)
testparam
ฟังก์ชัน JavaScript ใช้external.Log(...)
เพื่อแสดงผลข้อความในหน้าต่างแสดงผลของ LinqPad และalert(...)
แสดงผลเพื่อแสดงข้อความป๊อปอัพ
คุณสามารถทำให้สิ่งนี้ง่ายขึ้นโดยการเพิ่มคลาส / เมธอดส่วนขยายต่อไปนี้:
public static class ScriptExtension
{
public static object RunJavaScript(this LINQPad.Controls.Literal literal,
string jsFunction, params object[] p)
{
return literal.Dump().HtmlElement.InvokeScript(true, jsFunction, p);
}
public static LINQPad.Controls.Literal CreateJavaScript(string jsFunction)
{
return new LINQPad.Controls.Literal("script", jsFunction);
}
}
จากนั้นคุณสามารถเรียกตัวอย่างก่อนหน้าได้ดังนี้:
// JavaScript inside C#
var literal = ScriptExtension.CreateJavaScript(
@"function jsFoo(x) {
alert('jsFoo got parameter: ' + x);
var a = ['x', 'y', 'z']; external.log('Fetched \'' + a.pop() + '\' from Stack');
external.log('message from C#: \'' + x + '\'');
}");
// render & invoke
literal.RunJavaScript("jsFoo", "testparam");
สิ่งนี้มีผลเหมือนกัน แต่อ่านได้ง่ายกว่า (หากคุณต้องการทำจาวาสคริปต์เพิ่มเติม ;-))
ตัวเลือกอื่นถ้าคุณชอบนิพจน์แลมบ์ดาและคุณไม่ต้องการระบุชื่อฟังก์ชั่นเป็นสตริงทุกครั้งที่คุณโทรคุณสามารถทำได้:
var jsFoo = ScriptExtension.CreateJavaScript(
@"function jsFoo(x) { ... }");
ScriptExtension.RunJavaScript(() => jsFoo, "testparam");
หากคุณเพิ่มฟังก์ชันผู้ช่วย
public static object RunJavaScript(Expression<Func<LINQPad.Controls.Literal>> expr,
params object[] p)
{
LINQPad.Controls.Literal exprValue = expr.Compile()();
string jsFunction = ((MemberExpression)expr.Body).Member.Name;
return exprValue.Dump().HtmlElement.InvokeScript(true, jsFunction, p);
}
ScriptExtension
ในชั้นเรียน นี่จะแก้ไขชื่อตัวแปรที่คุณใช้ (ที่นี่jsFoo
) ซึ่งเกิดขึ้นเป็นชื่อเดียวกับฟังก์ชัน JavaScript (หมายเหตุว่านิพจน์แลมบ์ดาใช้เพื่อแก้ไขชื่อตัวแปรซึ่งไม่สามารถทำได้โดยใช้nameof(paramName)
ภายในฟังก์ชัน)
บางครั้งมันจะมีประโยชน์ในการเขียนทับข้อความที่คุณทิ้งแทนที่จะใส่ลงในบรรทัดใหม่ตัวอย่างเช่นหากคุณกำลังดำเนินการค้นหาที่ใช้เวลานานและต้องการแสดงความคืบหน้า ฯลฯ ฯลฯ (ดู ProgressBar ด้านล่าง) สิ่งนี้สามารถทำได้โดยใช้ a DumpContainer
, คุณสามารถใช้มันตามที่แสดงใน
ตัวอย่างที่ 1:
void Main()
{
var dc = new DumpContainer("Doing something ... ").Dump("Some Action");
System.Threading.Thread.Sleep(3000); // wait 3 seconds
dc.Content += "Done.";
}
หมายเหตุว่าสำหรับวัตถุที่ซับซ้อนมากขึ้นบางอย่างที่คุณอาจจะต้องใช้มากกว่าdc.UpdateContent(obj);
dc.Content=...
ตัวอย่างที่ 2:
void Main()
{
var dc = new DumpContainer().Dump("Some Action");
for (int i = 10; i >= 0; i--)
{
dc.UpdateContent($"Countdown: {i}");
System.Threading.Thread.Sleep(250);
};
dc.UpdateContent("Ready for take off!");
}
การแสดงความคืบหน้าสามารถทำได้โดยใช้ ProgressBar ดังนี้:
ตัวอย่าง:
void Main()
{
var prog = new Util.ProgressBar("Processing").Dump();
for (int i = 0; i < 101; i++)
{
Thread.Sleep(50); prog.Percent = i;
}
prog.Caption = "Done";
}
นี้คล้ายกับตัวอย่างการถ่ายโอนข้อมูลก่อนหน้า แต่คราวนี้แสดงภาพเคลื่อนไหวแถบความคืบหน้าที่ดี
คุณรู้หรือไม่ว่าคุณสามารถเขียนการทดสอบหน่วยใน LinqPad? ตัวอย่างเช่นคุณสามารถใช้กรอบงาน xUnit มันสามารถใช้ได้ผ่านการสนับสนุน NUGET LinqPad ของ - ผ่านF4- Add NUGET....ในคลิกโต้ตอบ ต่อไปนี้เป็นคำอธิบายทีละขั้นตอนวิธี ใช้ xUnit กับ LinqPad V5 หรือ V6
หากฉันค้นพบเพิ่มเติมฉันจะอัปเดตคำตอบนี้