2011-02-01 20 views
8

Có công cụ tính toán nào cho C# có thể tự động tính toán lại các trường phụ thuộc khi giá trị thay đổi không?Một thứ như một công cụ tính toán cho C#?

Hãy để tôi tự do trong một giây, tôi tưởng tượng một cái gì đó như thế này ..

Field<double> quantity = Field.Create<double>("Quantity"); 
Field<double> unitCost = Field.Create<double>("Unit Cost"); 
Field<double> total = Field.Create<double>("Total"); 

total.Calculation((q,uc) => q * uc, quantity, value); 
     // would have signature something like this: 
     // void Calculation<TR,T1,T1>(Func<TR,T1,T2>, Field<T1>, Field<T2>) 

này sẽ thiết lập các lĩnh vực mà tự động tuyên truyền các giá trị phụ thuộc.

quantity.Value = 5.0; 
unitCost.Value = 1.5; 
Assert.That(total.Value, Is.EqualTo(7.5)); 

Rõ ràng đây là ví dụ đơn giản, việc sử dụng cuối cùng sẽ giống nhiều hơn với các tính toán của bảng tính phức tạp.

Suy nghĩ thêm sẽ thật tuyệt vời nếu trường/ô hỗ trợ thông báo thay đổi.

+3

Tra cứu "công cụ quy tắc" trong Windows Workflow Foundation. –

+0

Tôi không biết nếu nó đã tồn tại, nhưng nó trông giống như một suy nghĩ tốt đẹp để thực hiện anyway, bạn 'chỉ cần INotifyPropertyChanging và phân hủy cây biểu hiện để liên kết depedencies. – Guillaume86

Trả lời

5

Bạn đã xem http://ncalc.codeplex.com chưa?

Tính năng mở rộng, nhanh chóng (ví dụ: có bộ nhớ cache riêng) cho phép bạn cung cấp các hàm và biến tùy chỉnh tại thời gian chạy bằng cách xử lý sự kiện EvaluateFunction/EvaluateParameter. Các biểu thức mẫu có thể phân tích cú pháp:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); 

    e.Parameters["Pi2"] = new Expression("Pi * Pi"); 
    e.Parameters["X"] = 10; 

    e.EvaluateParameter += delegate(string name, ParameterArgs args) 
    { 
     if (name == "Pi") 
     args.Result = 3.14; 
    }; 

    Debug.Assert(117.07 == e.Evaluate()); 

Nó cũng xử lý unicode & nhiều kiểu dữ liệu nguyên bản. Nó đi kèm với một tập tin antler nếu bạn muốn thay đổi ngữ pháp. Ngoài ra còn có một ngã ba hỗ trợ MEF để tải các chức năng mới.

Nó cũng hỗ trợ toán tử logic, chuỗi ngày/giờ và nếu câu lệnh.

một giải pháp

Bạn có thể có thể làm tính toán lại tự động bằng cách thực hiện INotifyPropertyChanged sau đó làm một cái gì đó giống như

  • thiết của một lĩnh vực biểu this.Field.Expression = new Expression ("Field1 + Field2 ");

On notifypropertyupdated trong lớp

  • cho từng lĩnh vực (với sự phản ánh) mà là một chức năng
  • nếu đó là biểu hiện liên quan đến lĩnh vực thay đổi sau đó tính toán lại biến.
  • trên tính toán lại bạn cần phải xử lý các sự kiện EvaluateParameter sử dụng phản ánh để tìm ra lĩnh vực phải và trích xuất giá trị của nó (bạn có thể bộ nhớ cache để tránh phản chiếu nếu cần thiết)
+0

Dự án thú vị - nó có xử lý các phụ thuộc không? I E.Tôi có thể xây dựng một loạt các biểu thức dựa trên kết quả của các biểu thức khác không? Nếu chúng theo thứ tự sai (hoặc nếu sau này thay đổi giá trị của một cái gì đó được sử dụng bởi trước đây - nó sẽ xử lý cập nhật tầng?) Tài liệu dường như tránh chủ đề (có lẽ tôi chỉ đang tìm sai địa chỉ) – Rudu

+0

@Rudu "nó xử lý các phụ thuộc", nó sẽ xử lý một DAG biểu thức di chuyển từ biểu thức đầu tiên thông qua các biểu thức được chỉ định như tham số cho biểu thức đó và sau đó đến các biểu thức được chỉ định làm tham số của các biểu thức đó. Bằng cách này bạn không bao giờ nhận được một phụ thuộc vòng tròn và thứ tự tính toán nên luôn luôn được chính xác sicne phụ thuộc được tính toán đầu tiên. – GreyCloud

+0

@Rudu - ví dụ cuối cùng về http://ncalc.codeplex.com/ cho biết cách lồng nhau có thể diễn ra. Về chủ đề cập nhật xếp tầng. Không có điều này sẽ không xảy ra, giá trị bạn nhận được là giá trị được tính tại thời điểm đó. Bạn sẽ phải sắp xếp các bản cập nhật tầng thông qua một cái gì đó như INotifyPropertyChanged trên lớp có chứa dữ liệu – GreyCloud

1

Tôi hỏi một câu hỏi tương tự ở đây: Truly declarative language?

Theo như tôi biết không, chỉ nghe nói về NCalc, tôi sẽ xem xét nó. Tôi có một dự án làm khá nhiều những gì bạn mô tả và sau đó một số giống như bộ nhớ đệm/bộ nhớ cache rơi vào thay đổi giá trị hoặc cấu trúc mô hình. Hãy suy nghĩ f nó như một sự giao nhau giữa một cơ sở dữ liệu và Excel. Bạn cũng có thể định nghĩa các lớp vv và liên kết chúng với nhau thành các mô hình lớn với hàng triệu đối tượng trong đồ thị, không chỉ là cây cối. Máy chủ khách hàng vv Ngoài ra còn có một trình soạn thảo mô hình nơi bạn tạo các mô hình trong một giao diện người dùng để bạn có thể phân tích cách tất cả các phép tính được xây dựng trên nhau.

Tại sao bạn hỏi chính xác?

1

Tôi khuyên bạn cũng nên xem Jace. Jace là một công cụ tính toán hiện đại hơn cho khung công tác .NET. Nó nhanh hơn rất nhiều so với NCalc được đề xuất ở trên. Hơn nữa nó hỗ trợ nhiều nền tảng hơn (.NET, WinRT, WP7 và WP8).

Thông tin thêm về Jace có thể được tìm thấy trên trang GitHub: https://github.com/pieterderycke/Jace

NuGet liên kết: https://www.nuget.org/packages/Jace

1

Có nhiều động cơ tính toán các thông số vô hướng, và có cơ tính cao cấp cho các bảng, thường được sử dụng cho các ứng dụng như lập kế hoạch tài chính, tính toán phí và hoa hồng, tính toán mạng và hợp đồng ...

Để tôi giải thích điều này ngay. Xem xét các công thức sau đây cho vô hướng:

1) z = f1(x,y) 
2) p = f2(z,n) 
3) q = f3(x,p) 
... 

v.v. Việc cấu hình các hàm và các cây phụ thuộc như vậy đòi hỏi một công cụ tính toán với các tham số vô hướng. Tôi sẽ (cũng) đề xuất liên kết sau đây cho một công cụ tính toán được viết bằng C# như một điểm khởi đầu tốt: http://www.codeproject.com/Articles/246374/A-Calculation-Engine-for-NET

Như đã đề cập, cũng có các công cụ tính toán có chức năng bảng. Nguyên tắc chính là giống nhau:

1) (T4, T5) = TableFunction1(T1, T2, T3) 
2) (T7, T8) = TableFunction2(T2, T4) 
... 

v.v. Lưu ý rằng một hàm bảng có thể trả về nhiều bảng dưới dạng kết quả đầu ra, như được hiển thị ở trên.

Có hai vấn đề chính cần quan sát tại đây:

a) Giá trị của bảng T7 và T8 phụ thuộc vào bảng T2 và T4. Do đó, các bảng T7 và T8 cần phải được cập nhật bằng cách thực hiện hàm "TableFunction2" chỉ khi có thay đổi trong một trong các tham số đầu vào T2 hoặc T4.

Tương tự, T4 chỉ cần cập nhật nếu T1, T2 hoặc T3 được cập nhật; cây phụ thuộc!

b) Tách cơ sở dữ liệu khỏi quá trình tính toán: Công cụ tính toán phải hoạt động độc lập với bất kỳ cấu trúc dữ liệu cố định hoặc lược đồ cơ sở dữ liệu nào để có thể tích hợp với bất kỳ cơ sở dữ liệu và cấu trúc dữ liệu nào.

Bạn có thể tìm thấy bài viết có liên quan của tôi, nơi những nguyên tắc này được giải thích tại địa chỉ:

Kiến trúc logic của một khung Tính toán Rule-Based http://finaquant.com/logical-architecture-of-a-rule-based-calculation-framework/1053

Bây giờ, một C#/thư viện NET cho một công cụ tính toán với các bảng. khi các tham số đầu vào và đầu ra đang được phát triển dựa trên các nguyên tắc này.

Lưu ý cho người kiểm duyệt: Vui lòng xóa liên kết ở trên nếu được tính là tự quảng cáo.

+0

Một điểm khởi đầu tốt: http: //www.codeproject .com/Articles/17853/Thực hiện một công cụ giống như Excel – tuncalik