Các phương thức [mở rộng] LINQPad


143

Có ai có một danh sách đầy đủ các phương pháp và phương thức mở rộng LINQPad không, chẳng hạn như

.Dump()

SubmitChanges()

1
Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì LINQPad là một công cụ luôn thay đổi, có câu trả lời chắc chắn và cụ thể và cuối cùng cho câu hỏi này sẽ có tuổi thọ rất ngắn. Tôi đề nghị đóng nó ngoài chủ đề để tránh thúc đẩy các câu hỏi tương tự cho các công cụ khác.
Lasse V. Karlsen

5
Không phải tôi có bất cứ điều gì để nói về việc bỏ phiếu, nhưng tôi chắc chắn không đồng ý với việc đóng câu trả lời này. Đầu tiên, chỉ cần nhìn vào các upvote cho câu hỏi, sau đó nhìn vào các upvote cho hai bình luận đầu tiên. Thứ hai, làm thế nào các câu trả lời từ Joseph có thể ít hơn một câu trả lời cuối cùng; ông đã viết điều đó. Cuối cùng, các ứng dụng khác sử dụng Stackoverflow cho tài liệu của họ. Tôi sử dụng LinqPad để phát triển mọi lúc, tạo mẫu truy vấn C # và Linq, chạy SQL và thực hiện các tác vụ DBA nhanh và hàng tá thứ khác. Vì vậy, ít nhất là đối với tôi, câu trả lời chắc chắn là về chủ đề.
EoRaptor013

3
Đóng lại: Tôi đã thêm nhiều câu trả lời cho các câu hỏi cũ hơn trên C # để cung cấp một kỹ thuật hiện đại hơn đã được giới thiệu cho ngôn ngữ kể từ khi câu hỏi được trả lời. IMO chúng ta nên kỳ vọng rằng kiến ​​thức mà trang web này đại diện sẽ được sửa đổi và cập nhật khi công nghệ tiếp tục. Phạm vi các chủ đề mà các bản cập nhật trong tương lai có thể thỏa hiệp hoặc vô hiệu hóa các câu trả lời được đưa ra tại một thời điểm cụ thể là khá rộng: nếu chúng tôi đóng tất cả các câu hỏi về điều này có thể xảy ra, Stack Overflow sẽ là một tài nguyên kém hơn nhiều! Ở đây, một danh sách đầy đủ có thể trở thành một danh sách một phần tốt hơn là không có danh sách!
Bob Sammer 18/07/19

Câu trả lời:


253

LINQPad định nghĩa hai phương thức mở rộng (trong LINQPad.Extensions), cụ thể là Dump()Disassemble(). Dump()ghi vào cửa sổ đầu ra bằng bộ định dạng đầu ra của LINQPad và bị quá tải để cho phép bạn chỉ định một tiêu đề:

typeof (int).Assembly.Dump ();
typeof (int).Assembly.Dump ("mscorlib");

Bạn cũng có thể chỉ định độ sâu đệ quy tối đa để ghi đè mặc định của 5 cấp độ:

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

Tháo rời () tháo rời bất kỳ phương thức nào IL, trả về đầu ra trong một chuỗi:

typeof (Uri).GetMethod ("GetHashCode").Disassemble().Dump();

Ngoài hai phương thức mở rộng đó, có một số phương thức tĩnh hữu ích trong LINQPad.Util. Chúng được ghi lại trong tự động hoàn thành và bao gồm:

  • Cmd - thực thi lệnh shell hoặc chương trình bên ngoài
  • CreateXhtmlWriter - tạo một trình soạn thảo văn bản sử dụng trình định dạng Dump () của LINQPad
  • SqlOutputWriter - trả về trình soạn thảo văn bản ghi vào cửa sổ đầu ra SQL
  • GetMyQueries , GetSamples - trả về một tập hợp các đối tượng thể hiện các truy vấn / mẫu đã lưu của bạn (ví dụ: thực hiện tìm kiếm bằng Edit | Search All)
  • Làm nổi bật - bao bọc một đối tượng để nó sẽ nổi bật màu vàng khi kết xuất
  • VerticalRun - cho phép bạn kết xuất một loạt các đối tượng trên cùng một dòng

LINQPad cũng cung cấp lớp HyperLinq. Điều này có hai mục đích: đầu tiên là hiển thị các siêu liên kết thông thường:

new Hyperlinq ("www.linqpad.net").Dump();
new Hyperlinq ("www.linqpad.net", "Web site").Dump();
new Hyperlinq ("mailto:user@domain.com", "Email").Dump();

Bạn có thể kết hợp điều này với Util.HorizontalRun:

Util.HorizontalRun (true,
  "Check out",
   new Hyperlinq ("http://stackoverflow.com", "this site"),
  "for answers to programming questions.").Dump();

Kết quả:

Kiểm tra trang web này để trả lời các câu hỏi lập trình.

Mục đích thứ hai của HyperLinq là tự động xây dựng các truy vấn:

// 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();

Bạn cũng có thể viết các phương thức mở rộng của riêng mình trong LINQPad. Truy cập 'Truy vấn của tôi' và nhấp vào truy vấn có tên 'Tiện ích mở rộng của tôi'. Mọi loại / phương thức xác định ở đây đều có thể truy cập được đối với tất cả các truy vấn:

void Main()
{
  "hello".Pascal().Dump();  
}

public static class MyExtensions
{
  public static string Pascal (this string s)
  {
    return char.ToLower (s[0]) + s.Substring(1);
  }
}

Trong 4.46 (.02) các lớp và phương thức mới đã được giới thiệu :

  • DumpContainer (lớp)
  • OnDemand (phương thức mở rộng)
  • Util.ProTHERBar (lớp)

Ngoài ra, lớp Hyperlinq hiện hỗ trợ một đại biểu Hành động sẽ được gọi khi bạn nhấp vào liên kết, cho phép bạn phản ứng với nó trong mã chứ không chỉ liên kết với các trang web bên ngoài.

DumpContainer là một lớp thêm một khối vào cửa sổ đầu ra có thể thay thế nội dung của nó.

GHI CHÚ! Hãy nhớ .Dump()những DumpContainerbản thân ở vị trí thích hợp.

Để sử dụng:

var dc = new DumpContainer();
dc.Content = "Test";
// further down in the code
dc.Content = "Another test";

OnDemandlà một phương thức mở rộng sẽ không xuất nội dung của tham số của nó sang cửa sổ đầu ra, mà thay vào đó thêm một liên kết có thể nhấp, khi nhấp vào sẽ thay thế liên kết bằng .Dump()nội dung ed của tham số. Điều này rất tốt cho các cấu trúc dữ liệu đôi khi cần thiết mà tốn kém hoặc chiếm nhiều dung lượng.

GHI CHÚ! Nhớ .Dump()kết quả của cuộc gọi OnDemandở vị trí thích hợp.

Để dùng nó:

Customers.OnDemand("Customers").Dump(); // description is optional

Util.ProgressBar là một lớp có thể hiển thị một thanh tiến trình đồ họa bên trong cửa sổ đầu ra, có thể thay đổi khi mã di chuyển.

GHI CHÚ! Hãy nhớ .Dump()đối tượng Util.ProTHERBar ở vị trí thích hợp.

Để dùng nó:

var pb = new Util.ProgressBar("Analyzing data");
pb.Dump();
for (int index = 0; index <= 100; index++)
{
    pb.Percent = index;
    Thread.Sleep(100);
}

33
Không có gì tốt hơn một câu trả lời từ chính tác giả!
Giăng

1
Joe, tôi thực sự muốn nguyên mẫu một số đồ họa hoạt động tốt và sau đó muốn đưa ra một bitmap; thật tuyệt vời với phương pháp Hiển thị cho loại công việc này khi bạn muốn trực quan hóa, làm việc với Đồ họa, Hình ảnh, v.v. Có thể cung cấp trực quan hóa gọn gàng cho một số loại khác.
Bent Rasmussen

... Trên thực tế, miễn là bạn có thể gửi đồ họa đến bảng đầu ra, chúng ta có thể tự xây dựng các tiện ích mở rộng cho phần còn lại.
Bent Rasmussen

3
Bản beta 4.26 cho phép bạn đưa XHTML vào luồng đầu ra, bằng cách gọi Util.RawHtml. Truy cập www.linqpad.net/beta.aspx (hoặc đợi vài ngày cho RTM).
Joe Albahari

1
Alex - để có được> 1 điều trên một dòng, sử dụng Util.HTHERRun
Joe Albahari

131

Bên cạnh sự nổi tiếng myQuery.Dump("Query result:"), một tính năng khác phải kể đến làUtil lớp: Nó chứa nhiều phương thức khá tiện dụng (một số trong số chúng tôi đã đề cập, nhưng còn nhiều hơn nữa).

Cũng thú vị là bạn có thể sửa đổi cách Dump()làm việc .

Cuối cùng tôi sẽ chỉ cho bạn cách bạn có thể thay đổi vĩnh viễn (ví dụ: chèn, cập nhật, xóa truy vấn LINQ) bằng cách sử dụng SubmitChanges()hoặc SaveChanges()cũng như cách bạn có thể truy cập vào đối tượng kết nối nội bộ của LinqPad.

Và để làm tròn nó, tôi sẽ chỉ cho bạn cách bạn có thể tạo đồ họa 2d đơn giản bên trong LinqPad (vẽ các đường, bitmap hoặc các hàm ).

Vì vậy, đây là một bộ sưu tập các tính năng LinqPad tích hợp (từ kinh nghiệm của riêng tôi với công cụ):


.Dump ()

(tham số có sẵn trong LinqPad v5.03.08 trở lên)

Tất cả người dùng LinqPad đều biết và yêu thích .Dump()phương thức mở rộng, tiêu thụ và in (gần như) mọi thứ.

Nhưng bạn có biết có một vài thông số có sẵn? Hãy xem đoạn mã này:

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

Các ví dụ 1st in chỉ biến acvà da bd, các ví dụ 2 làm điều ngược lại (lưu ý rằng nó xác định chỉ có 2 trong các thông số có sẵn). Các biến yz không thể được ẩn riêng lẻ, vì chúng không ở cấp cao nhất.

Các tham số sau đây khả dụng ( tất cả đều là tùy chọn ):

  • description [chuỗi] - cung cấp mô tả cho đối tượng kết xuất
  • depth [int?] - giới hạn độ sâu của các đối tượng được kiểm tra đệ quy
  • toDataGrid [bool] - nếu đúng, đầu ra được định dạng dưới dạng dữ liệu chứ không phải là RichText
  • exclude[chuỗi] - nếu bạn cung cấp danh sách các biến được phân tách bằng dấu phẩy, chúng sẽ bị loại trừ khỏi đầu ra (trong ví dụ "a, c": bdđược hiển thị acbị ẩn)
  • exclude[chuỗi] với tiền tố "+" - tiền tố đảo ngược logic của tham số loại trừ. Điều này có nghĩa là, nếu bạn cung cấp danh sách các biến được phân tách bằng dấu phẩy, tất cả ngoại trừ các biến được chỉ định đều bị ẩn (trong ví dụ "+ b, d": bdđược hiển thị, tất cả các biến khác đều bị ẩn)
  • lưu trữ các thuộc tính được bao gồm và loại trừ trong một biến (mới kể từ LinqPad V5.09.04):
    var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
    Chuỗi đầu tiên chứa danh sách các thuộc tính cần bao gồm, chuỗi thứ hai một danh sách cần loại trừ
  • mở rộng khi nhấp: Nếu bạn sử dụng .OnDemand("click me").Dump();thay vì .Dump(), nó sẽ hiển thị một liên kết bạn có thể nhấp vào để mở rộng. Hữu ích nếu bạn muốn kiểm tra các giá trị, ví dụ: Util.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump();luôn hiển thị ID theo mặc định nhưng chỉ tiết lộ chi tiết customerObjectnếu bạn quan tâm.

Các chủ đề nâng cao hơn về Dump có thể được tìm thấy ở đâyở đó .


Môi trường

Đây không phải là một phần mở rộng LinqPad, mà là một lớp .NET, nhưng vì nó hữu ích, nên tôi sẽ đề cập đến nó. Bạn có thể nhận được nhiều thông tin hữu ích bạn có thể sử dụng trong các tập lệnh của mình, chẳng hạn như:

Environment.UserDomainName.Dump();
Environment.MachineName.Dump();
Environment.UserName.Dump();
Environment.CurrentDirectory.Dump();
Environment.SystemDirectory.Dump();

NB Để có được Domain\UserNametôi sẽ sử dụng System.Security.Principal.WindowsIdentity.GetCurrent().Name
chứ không phải Environment.UserDomainName+@"\"+Environment.UserName.


Util.WriteCsv

( mới: khả dụng kể từ phiên bản LinqPad v4.45.05 (beta) )

Util.WriteCsv (Customers, @"c:\temp\customers.csv");

Điều này sẽ ghi nội dung của bảng Customersvào tệp CSV c:\temp\customers.csv. Bạn cũng có thể tìm thấy một ví dụ hay về cách sử dụng Util.WriteCsvvà sau đó hiển thị dữ liệu CSV trong cửa sổ kết quả của Linqpad tại đây .

Gợi ý:

  • Để nhận / tạo tệp CSV nằm trong cùng thư mục với truy vấn, bạn có thể sử dụng:
    var csvFile=Util.CurrentQueryPath.Replace(".linq", ".csv");

  • Nếu bảng lớn, hãy sử dụng ObjectTrackingEnabled = false;trước khi bạn viết CSV để tránh lưu vào bộ nhớ cache.

  • Nếu bạn muốn xuất một bảng ở định dạng XML chứ không phải là tệp được phân tách bằng dấu phẩy, bạn có thể làm như sau:

    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();

    Ví dụ này trả về tất cả các phần tử có thuộc tính attr1chứa giá trị "a"từ tệp XML có cùng tên với truy vấn và được chứa trong cùng một đường dẫn. Kiểm tra liên kết này để biết thêm các mẫu mã.


Util.GetPassword

var pwd = Util.GetPassword("UserXY");

Điều này sẽ lấy lại mật khẩu từ trình quản lý mật khẩu tích hợp của LinqPad. Để tạo & thay đổi mật khẩu, mở "Mật khẩu quản lý" mục trình đơn trong "File" menu của LinqPad. Nếu không có mật khẩu được lưu khi bạn chạy mã C #, một hộp thoại mật khẩu sẽ mở ra hỏi bạn mật khẩu và bạn có thể chọn và lưu nó một cách nhanh chóng bằng cách chọn hộp kiểm lưu mật khẩu (ví dụ: mật khẩu cho "UserXY" sẽ được lưu và sau này bạn có thể tìm thấy mục này trong Trình quản lý mật khẩu ).

Ưu điểm là bạn có thể lưu trữ mật khẩu trong LinqScripts mà bạn tạo một cách an toàn, riêng biệt và được mã hóa trong hồ sơ người dùng của Windows (nó được lưu trữ %localappdata%\LINQPad\Passwordsdưới dạng tệp). LinqPad sử dụng Windows DPAPI để bảo vệ mật khẩu.

Ngoài ra, mật khẩu được lưu trữ tập trung, vì vậy nếu bạn cần thay đổi nó, bạn có thể thực hiện nó trong menu và ngay lập tức áp dụng cho tất cả các tập lệnh bạn đã tạo.

Ghi chú:

  • Nếu bạn không muốn lưu mật khẩu và chỉ hiển thị hộp thoại mật khẩu, bạn có thể sử dụng tham số thứ 2 như sau:
    var pwd = Util.GetPassword("UserXY", true);
    Điều này sẽ bỏ chọn hộp kiểm lưu mật khẩu trong hộp thoại mật khẩu (tuy nhiên, người dùng vẫn có thể kiểm tra nó và chọn cách tiết kiệm nào).

  • Nếu bạn yêu cầu mật khẩu được lưu trữ trong a SecureString, bạn có thể sử dụng chức năng trợ giúp này (nb: để .ToSecureString()sử dụng phương thức tiện ích mở rộng , vui lòng theo liên kết này tại Stackoverflow - nó cũng cho phép bạn chuyển đổi lại nếu cần):
    System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
    {
      return Util.GetPassword(Name, noDefaultSave).ToSecureString();
    }


Util.Cmd

Phương pháp này hoạt động như một bộ xử lý lệnh. Bạn có thể gọi tất cả các lệnh bạn biết từ bảng điều khiển Windows.

Ví dụ 1 - thư mục:

Util.Cmd(@"dir C:\");

Điều này sẽ xuất kết quả của thư mục mà không cần .Dumpnó. Lưu trữ nó trong một biến có lợi thế là bạn có thể sử dụng các truy vấn Linq hơn nữa trên nó. Ví dụ:

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();

Điều này sẽ kết xuất tất cả các tệp có phần mở rộng tệp ".exe" hoặc "đậm" có trong C:\windows\system32. Công /stắc được sử dụng để lặp lại tất cả các thư mục con và /bđược sử dụng cho định dạng đầu ra trống. Lưu ý rằng tham số thứ hai của phương thức Cmd được chỉ định để triệt tiêu đầu ra của bàn điều khiển để chỉ hiển thị kết quả được lọc bằng phương thức Dump.

Bạn có thể thấy rằng điều này linh hoạt hơn các ký tự đại diện mà bạn có dirvì bạn có thể sử dụng toàn bộ tính linh hoạt của công cụ truy vấn của Linq.

Ví dụ 2 - trình soạn thảo văn bản:

Bạn có thể mở một tệp trong Notepad như thế này:

var filePath=@"C:\HelloWorld.txt";
Util.Cmd(@"%systemroot%\system32\notepad.exe", filePath);

Sử dụng

Hiển thị hình ảnh từ một URL. Thí dụ:

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.ProTHERBar, Util.ProTHER

Sử dụng Util.ProgressBarcho phép bạn hiển thị một thanh tiến trình. Bạn có thể sử dụng lớp người trợ giúp sau:

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;
        }
    }
}

Đơn giản chỉ cần sử dụng nó như ví dụ sau đây cho thấy:

void Main()
{
    var pb1= new ProgressBar();
    Thread.Sleep(50);
    pb1.Update(50, "Doing something"); Thread.Sleep(550);
    pb1.Update(100); Thread.Sleep(50);
}

Bạn cũng có thể sử dụng Util.Progressđể cập nhật thanh tiến trình tích hợp LinqPads, ví dụ:

Util.Progress = 25; // 25 percent complete

Sự khác biệt là nó sẽ không hiển thị trong cửa sổ kết quả và bạn không thể gán tin nhắn cho nó.


Util.RawHtml

Hiển thị HTML trong cửa sổ đầu ra. Thí dụ:

Util.RawHtml (new XElement ("h1", "This is a big heading")).Dump();

Hyperlinq, Util.HTHERRun

Bạn có thể sử dụng chức năng ví dụ này

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);
}

để hiển thị các siêu liên kết trong cửa sổ kết quả - hoặc bất kỳ hành động nào như mở trình soạn thảo yêu thích của bạn. Sử dụng:

ShowUrl("http://stackoverflow.com", "Check out StackOverflow");

Lưu ý rằng chức năng này luôn hoạt động, trong khi new Hyperlinq ("http://myURL", "Web site").Dump();không hoạt động đối với một số loại URL (đặc biệt, nếu bạn phải chuyển các tên cổng như ": 1234" như một phần của URL).


Util.ReadLine

Đọc đầu vào từ bàn điều khiển. Thí dụ:

int age = Util.ReadLine<int> ("Enter your age");

Là một từ đồng nghĩa cho Util.ReadLine<string>(), bạn cũng có thể sử dụng Console.ReadLine().

Nhưng có nhiều hơn thế! Bạn có thể tạo một trình phân tích cú pháp JSON đơn giản với đoạn mã sau - khá hữu ích, ví dụ nếu bạn muốn phân tích cú pháp và kiểm tra chuỗi JSON khi đang di chuyển. Lưu đoạn mã sau dưới dạng JSONAnalyzer.linq bằng trình soạn thảo văn bản và sau đó mở nó trong LinqPad (đây là để thêm các tài liệu tham khảo dễ dàng khi đang di chuyển):

<Query Kind="Program">
    <Reference>&lt;RuntimeDirectory&gt;\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");
}

Bây giờ bạn có thể chạy nó và chỉ cần dán một chuỗi JSON từ bảng tạm vào bảng điều khiển - nó sẽ sử dụng Dumpchức năng để hiển thị nó như một đối tượng độc đáo - và bạn cũng nhận được các thông báo lỗi của trình phân tích cú pháp trên màn hình để khắc phục các sự cố. Rất hữu ích để gỡ lỗi AJAX.

JSON


Util.ClearResults

Nếu bạn cần xóa cửa sổ kết quả bên trong tập lệnh của mình, hãy sử dụng:

Util.ClearResults();

Sử dụng tập lệnh này ở đầu tập lệnh của bạn hoặc - nếu bạn đang chạy nhiều truy vấn trong tập lệnh - bạn nên đợi người dùng nhập trước khi làm trống màn hình (ví dụ: bằng cách đặt trước tập lệnh Util.ReadLine).


Tùy chỉnh .Dump () - ICustomMemberProvider

Điều thú vị nữa là, bạn có thể thay đổi đầu ra của .Dump()phương thức. Đơn giản chỉ cần thực hiện giao diện ICustomMemberProvider, ví dụ

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
}

Nếu bạn tạo một thể hiện của lớp này, như

var obj1 = new test();
obj1.Dump("Test");

sau đó nó sẽ ra chỉ Hint, constMember1, constMember2, và myprop, nhưng không phải bất động sản xyz:

Linqpad đổ


Hiển thị MessageBox hoặc InputBox trong LinqPad

Nếu bạn cần hiển thị một hộp thông báo, hãy xem ở đây cách làm.

Ví dụ: bạn có thể hiển thị InputBox bằng cách sử dụng mã sau

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
    }
}

(đừng quên nhấn F4 và thêm Microsoft.VisualBasic.dll và các không gian tên của nó để làm cho công việc này)


Util.Run

( mới: khả dụng kể từ phiên bản LinqPad v4.52.1 (beta) )

Cho phép bạn chạy một tập lệnh LINQPad khác từ trong tập lệnh của bạn hoặc trong chương trình .NET hoặc dịch vụ Windows của riêng bạn (bằng cách tham khảo phiên bản LINQPad4-AnyCPU của LINQPad.exe). Nó thực thi kịch bản giống như công cụ dòng lệnh lprun.exesẽ làm điều đó.

Ví dụ:

const string path=@"C:\myScripts\LinqPad\";
var dummy=new LINQPad.QueryResultFormat(); // needed to call Util.Run
Util.Run(path+"foo.linq", dummy);

Ví dụ này chạy tập lệnh foo.linqchứa mã mẫu sau:

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");
}

Nó cho phép bạn kiểm tra xem tập lệnh đã được chạy từ bên trong GUI LinqPad hay thông qua lprun.exehoặc với Util.Run.

Lưu ý: Các biến thể sau đây của lệnh gọi có thể hữu ích:

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

GửiChanges () - Linq To SQL

Nếu bạn đang sử dụng LinqToQuery , bạn có thể muốn thay đổi vĩnh viễn (đối với các hoạt động chèn / cập nhật / xóa ). Vì bối cảnh cơ sở dữ liệu được LinqPad tạo ra hoàn toàn, bạn cần gọi SubmitChanges()sau mỗi thay đổi như được hiển thị bên dưới.

Ví dụ cho (LinqPad-) cơ sở dữ liệu Northwind :

Chèn

var newP = new Products() { ProductID=pID, CategoryID=cID, 
            ProductName="Salmon#"+pID.ToString() };
Products.InsertOnSubmit(newP);
SubmitChanges();    

Cập nhật

var prod=(from p in Products
            where p.ProductName.Contains("Salmon")
            select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
SubmitChanges(); 

Xóa bỏ

var itemsToDelete=Products.Where(p=> p.ProductName.Contains("Salmon") ||
    p.ProductName.Contains("Trout"));
foreach(var item in itemsToDelete) { Products.DeleteOnSubmit(item); }
SubmitChanges();

Lưu ý: Để có được ID hợp lệ cho các ví dụ trước, bạn có thể sử dụng:

var cID = (from c in Categories 
            where c.CategoryName.Contains("Seafood") 
            select c).FirstOrDefault().CategoryID;

var pID = Products.Count()+1;

trước khi bạn gọi họ


SaveChanges () - Khung thực thể

Nếu bạn đang sử dụng Entity Framework , bạn cũng có thể muốn thay đổi vĩnh viễn (đối với các hoạt động chèn / cập nhật / xóa ). Vì bối cảnh cơ sở dữ liệu được LinqPad tạo ra hoàn toàn, bạn cần gọi SaveChanges()sau mỗi thay đổi như được hiển thị bên dưới.

Các ví dụ về cơ bản giống như trước đây đối với LinqToQuery , nhưng bạn cần sử dụng SaveChanges()thay thế, và để chèn và xóa các phương thức cũng đã thay đổi.

Chèn

var newP = new Products() { ProductID=pID, CategoryID=cID, 
            ProductName="Salmon#"+pID.ToString() };
Products.Add(newP);
SaveChanges();  

Cập nhật

var prod=(from p in Products
            where p.ProductName.Contains("Salmon")
            select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
SaveChanges(); 

Xóa bỏ

var itemsToDelete=Products.Where(p=> p.ProductName.Contains("Salmon") ||
    p.ProductName.Contains("Trout"));
foreach(var item in itemsToDelete) { Products.Remove(item); }
SaveChanges();

Lưu ý: Để có được ID hợp lệ cho các ví dụ trước, bạn có thể sử dụng:

var cID = (from c in Categories 
            where c.CategoryName.Contains("Seafood") 
            select c).FirstOrDefault().CategoryID;

var pID = Products.Count()+1;

trước khi bạn gọi họ


này - bối cảnh cơ sở dữ liệu

Trong LinqPad , bối cảnh cơ sở dữ liệu được áp dụng tự động bằng cách sử dụng hộp tổ hợp ở trên cùng và chọn cơ sở dữ liệu phù hợp cho truy vấn của bạn. Nhưng đôi khi, rất hữu ích khi tham chiếu nó một cách rõ ràng, ví dụ nếu bạn sao chép một số mã từ dự án của bạn ra khỏi Visual Studio và dán nó vào LinqPad.

Đoạn mã của bạn được lấy từ dự án Visual Studio rất có thể trông như thế này:

var prod=(from p in dc.Products
            where p.ProductName.Contains("Salmon")
            select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
dc.SaveChanges(); 

Bây giờ phải làm gì với dc? Tất nhiên, bạn có thể loại bỏ từng lần xuất hiện dc.trong truy vấn của mình, nhưng nó dễ dàng hơn nhiều. Chỉ cần thêm

var dc=this; // UserQuery

đến đầu đoạn trích của bạn như vậy:

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(); 
}   

và mã sẽ hoạt động ngay lập tức!


này. Kết nối

Sử dụng LinqPad với OleDb, chuyển đổi một đối tượng có thể truy cập thành dữ liệu Linq, các truy vấn SQL trong Linq

Đoạn mã sau giúp bạn sử dụng LinqPad với OleDb. Thêm System.Data.OleDbtừ cụm System.Datavào thuộc tính truy vấn, sau đó dán đoạn mã sau vào 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();

Bây giờ hãy thêm kết nối SqlServer vào LinqPad và thêm cơ sở dữ liệu Northwind để chạy ví dụ này.

Lưu ý: Nếu bạn chỉ muốn lấy cơ sở dữ liệu và máy chủ của kết nối hiện được chọn, bạn có thể sử dụng đoạn mã này:

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();
}

Bạn thậm chí có thể chuyển đổi myDSthành Linq, các câu trả lời cho câu hỏi sau cho biết cách thực hiện: Các ví dụ hay về việc sử dụng từ khóa động .NET 4 với Linq

Một ví dụ nữa: Giả sử DBA của bạn cung cấp cho bạn một truy vấn SQL và bạn muốn phân tích kết quả trong LinqPad - tất nhiên là trong Linq, không phải trong SQL. Sau đó, bạn có thể làm như sau:

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;
}

Trong ví dụ này, truy vấn CHỌN của DBA chỉ là "ném vào" văn bản lệnh và kết quả được City lọc và sắp xếp theo thứ tự.
Tất nhiên, đây là một ví dụ đơn giản, DBA của bạn có thể sẽ cung cấp cho bạn một tập lệnh phức tạp hơn, nhưng bạn đang có ý tưởng: Chỉ cần thêm một lớp kết quả hỗ trợ có chứa tất cả các trường từ mệnh đề SELECT và sau đó bạn có thể trực tiếp sử dụng nó .
Bạn thậm chí có thể lấy kết quả từ một thủ tục được lưu trữ theo cách này và sử dụng nó trong Linq. Như bạn có thể thấy, trong ví dụ này tôi không quan tâm đến kiểu dữ liệu và sử dụng dynamicđể thể hiện nó.
Vì vậy, đây thực sự là về lập trình nhanh chóng để có thể phân tích dữ liệu nhanh chóng. Bạn không nên làm điều này trong ứng dụng thực tế của mình vì nhiều lý do (SQL SQL, vì bạn có thể sử dụng EF ngay từ đầu, v.v.).


Bảng điều khiển

Vẽ đồ họa trong LinqPad, phần 1

Để sử dụng các ví dụ dưới đây, báo chí F4và thêm System.Windows.dll, System.Windows.Forms.dll, WindowsFormsIntegration.dll, PresentationCore.dllPresentationFramework.dllđể chương trình LinqPad bạn và cũng có thêm không gian tên System.Windows.Shapes.

Các ví dụ 1 chỉ đơn giản là vẽ một dòng:

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");

Các ví dụ 2 cho thấy cách bạn có thể hiển thị hình ảnh trong LinqPad bằng PanelManager. Thông thường LinqPad chỉ hỗ trợ các đối tượng Wpf. Ví dụ này sử dụng System.Windows.Forms.Integration.WindowsFormsHostđể tạo Windows.Forms.PictureBoxsẵn (nó được lấy cảm hứng từ điều này ):

// 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);
}

Điều này sẽ tạo ra đồ họa sau (mục bảng "Đồ họa" và "Hình ảnh" được thêm vào bằng các ví dụ ở trên):

Đang hiển thị_Gpson_in_LinqPad

Nếu bạn muốn hiển thị hình ảnh từ cơ sở dữ liệu Northwind, bạn có thể làm như sau:
Thay đổi tên tệp hình ảnh thành "NorthwindPics.jpg", sau đó thêm mã sau vào đầu phương thức Main () của ví dụ thứ 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();
}

Nó sẽ đọc bản ghi đầu tiên từ bảng Nhân viên và hiển thị hình ảnh.

Kiểm tra các liên kết sau để tìm hiểu thêm:
Hình dạng và bản vẽ cơ bản trong trình hiển thị tùy chỉnh WPF
LinqPad

Lưu ý: Bạn cũng có thể đạt được điều tương tự mà không cần Bảng điều khiển, như ví dụ sau, tôi thấy ở đây cho thấy:

// 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();
}

Nó đang sử dụng .Dump()lệnh để hiển thị nó. Bạn có thể gọi image.Dump()nhiều lần và nó sẽ chắp thêm hình ảnh.


Biểu mẫu Windows

Vẽ đồ họa trong LinqPad, phần 2

Ví dụ sau, lấy cảm hứng từ bài đăng này , đang chỉ ra cách triển khai trình vẽ đồ thị chức năng đơn giản trong Linqpad 5 bằng 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;
}

Nó đang sử dụng khả năng của LinqPad để hiển thị các biểu mẫu Windows trong bảng kết quả. Thêm tài liệu tham khảo (nhấn ) : , , và thêm tất cả không gian tên từ các hội đồng.
Thí dụ
F4
System.Drawing.dllSystem.Windows.Forms.dllSystem.Windows.Forms.DataVisualization.dll


Gợi ý bổ sung / đọc thêm:

  • Bạn muốn sử dụng LinqPad trong Visual Studio ? Đây là cách bạn có thể làm điều đó .

  • Cần phải có LinqPad như một "ứng dụng di động" ? Đọc ở đây làm thế nào để làm điều đó.

  • Trang web của Joe cho LinqPad luôn là một nguồn tuyệt vời. Bên trong LinqPad, Help -> What's Newcung cấp cho bạn các gợi ý về các chức năng và phương thức mới. Các LinqPad diễn đàn cũng chứa những gợi ý hữu ích.

  • Cũng rất hữu ích: Bài viết này về gỡ lỗi Linq (Pad).

  • Sử dụng lprun.exeđể chạy truy vấn LINQ trong tập lệnh bó của bạn . Đọc bài viết này để biết thêm chi tiết. Ví dụ:
    echo Customers.Take(100) > script.txt
    lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
    Trong ví dụ này, truy vấn là một biểu thức LINQ đơn giản. Tất nhiên, bạn có thể chuẩn bị các truy vấn phức tạp cũng như sử dụng -lang=programđể kích hoạt chế độ chương trình.

  • Bạn có thể viết các phương thức mở rộng và lưu trữ chúng trong tab My Queries ở phía bên trái LinqPad: Mục cuối cùng của cây có tên là Tiện ích mở rộng của tôi ; nhấp đúp chuột vào nó để mở tệp nơi bạn có thể viết các tiện ích mở rộng có sẵn cho tất cả các truy vấn của mình. Chỉ cần đặt chúng vào lớp tĩnh công khai MyExtensionsvà sử dụng Main()phương thức để bao gồm các kiểm tra cho tiện ích mở rộng của bạn.


2
thích mẹo về Util.ReadLine <string> ("Enter some json"); Trước đây tôi thường sao chép nó trong tập tin và sau đó đọc từ đó ... Tôi thực sự thích mẹo này. Cảm ơn!
loneshark99

2

Dump là một phương thức mở rộng toàn cầu và SendChanges xuất phát từ đối tượng DataContext là đối tượng System.Data.Linq.DataContext.

LP chỉ thêm Dump và Disassemble theo như tôi biết. Mặc dù tôi rất khuyên bạn nên mở nó trong Reflector để xem những gì khác có thể được sử dụng. Một trong những điều thú vị hơn là không gian tên LINQPad.Util có một số tính năng được LINQPad sử dụng trong nội bộ.


Lưu ý: Trong các phiên bản mới hơn của LinqPad: Nhấp vào .Dump()hoặc bất kỳ phương pháp nào khác trong trình chỉnh sửa nguồn, nhấn F12 để "phản ánh". Điều này bây giờ được tích hợp vào công cụ!
Matt

1

Đã đạt đến giới hạn văn bản StackOverflow trong câu trả lời trước của tôi , nhưng vẫn có nhiều tiện ích mở rộng thú vị hơn trong LinqPad. Một trong số đó tôi muốn đề cập:


Các hàm JavaScript (sử dụng .Dump())

Kể từ phiên bản 5.42 beta của LinqPad, bạn có thể nhúng các hàm JavaScript và gọi chúng trực tiếp từ mã C # của mình. Mặc dù điều này có một số hạn chế (so với JSFiddle), nhưng đây là một cách hay để kiểm tra nhanh một số mã JavaScript trong LinqPad.

Thí dụ:

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");
}

Trong ví dụ này, một hàm jsFoovới một tham số được chuẩn bị và lưu trữ trong biến literal. Sau đó, nó được kết xuất và được gọi thông qua .Dump().HtmlElement.InvokeScript(...), truyền tham số testparam.

Hàm JavaScript sử dụng external.Log(...)để xuất văn bản trong các cửa sổ đầu ra của LinqPad và alert(...)để hiển thị thông báo bật lên.

Bạn có thể đơn giản hóa điều này bằng cách thêm lớp / phương thức mở rộng sau :

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);
    }
}

Sau đó, bạn có thể gọi ví dụ trước như sau:

    // 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");

Điều đó có tác dụng tương tự, nhưng dễ đọc hơn (nếu bạn có ý định làm nhiều JavaScript hơn ;-)).

Một tùy chọn khác, nếu bạn thích biểu thức Lambda và bạn không muốn chỉ định tên hàm là chuỗi mỗi lần bạn gọi nó, bạn có thể làm:

var jsFoo = ScriptExtension.CreateJavaScript(
            @"function jsFoo(x) { ...  }"); 
ScriptExtension.RunJavaScript(() => jsFoo, "testparam");

miễn là bạn đã thêm chức năng trợ giúp

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);
}

đến lớp ScriptExtension. Điều này sẽ giải quyết tên biến bạn đã sử dụng (ở đây jsFoo) có cùng tên với chính hàm JavaScript (Lưu ý cách sử dụng biểu thức lambda để phân giải tên biến, điều này không thể được thực hiện bằng cách sử dụng nameof(paramName)bên trong hàm).


.Dump () - cập nhật một dòng tin nhắn

Đôi khi, rất hữu ích khi ghi đè lên văn bản bạn đã bỏ thay vì đặt nó vào một dòng mới, ví dụ nếu bạn đang thực hiện một truy vấn chạy dài và muốn hiển thị tiến trình của nó, v.v. (xem thêm ProgressBar bên dưới). Điều này có thể được thực hiện bằng cách sử dụng một DumpContainer, bạn có thể sử dụng nó như thể hiện trong

Ví dụ 1:

void Main()
{
   var dc = new DumpContainer("Doing something ... ").Dump("Some Action");
   System.Threading.Thread.Sleep(3000); // wait 3 seconds
   dc.Content += "Done.";
}

DumpContainerAnimation

Lưu ý rằng đối với một số đối tượng phức tạp hơn, bạn có thể phải sử dụng dc.UpdateContent(obj);chứ không phải dc.Content=....

Ví dụ 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!");
}

Util.ProTHERBar

Hiển thị tiến trình cũng có thể được thực hiện bằng cách sử dụng ProgressBar như sau:

Thí dụ:

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";
}

Điều này tương tự như ví dụ kết xuất trước đây, nhưng lần này hiển thị một hình ảnh động tiến trình tốt đẹp.


Kiểm tra đơn vị với LinqPad - xUnit

Bạn có biết bạn có thể viết bài kiểm tra đơn vị trong LinqPad không? Ví dụ: bạn có thể sử dụng khung xUnit. Nó có sẵn thông qua hỗ trợ NUGET của LinqPad - thông qua F4- trong hộp thoại bấm Add NUGET..... Dưới đây là mô tả từng bước cách sử dụng xUnit với LinqPad V5 hoặc V6.


Nếu tôi khám phá thêm, tôi sẽ cập nhật câu trả lời này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.