Tôi cần viết một cái gì đó mà tôi gọi là Aggregation Container, lưu trữ các tập hợp, về cơ bản là các hành động lấy một tập hợp các đối tượng và xuất ra một đối tượng đơn lẻ. Ví dụ về Tổng hợp sẽ là: Số học trung bình, Trung bình của một tập hợp các số, Hài hòa Trung bình v.v. Dưới đây là mã mẫu.Tập hợp và cách kiểm tra xem chúng ta có thể tổng hợp các đối tượng
var arithmeticMean = new Aggregation
{
Descriptor = new AggregationDescriptor { Name = "Arithmetic Mean" },
Action = (IEnumerable arg) =>
{
double count = 0;
double sum = 0;
foreach (var item in arg)
{
sum += (double)item;
count++;
}
return sum/count;
}
};
Đây là vấn đề của tôi với mã. Tôi đã giả định rằng các đối tượng chỉ là gấp đôi và do đó thực hiện một chuyển đổi. Nếu chúng không gấp đôi thì sao? Làm thế nào tôi có thể chắc chắn rằng tôi được phép tổng hợp hai đối tượng? Có một số loại giao diện cho rằng trong hội đồng tiêu chuẩn .Net? Tôi cần một cái gì đó như ISummable ... Hoặc tôi cần phải thực hiện nó bản thân mình (sau đó tôi sẽ phải bọc tất cả các loại nguyên thủy như đôi, int, etcetera để hỗ trợ nó).
Bất kỳ lời khuyên nào liên quan đến việc thiết kế chức năng như vậy sẽ hữu ích.
Vấn đề không phải là bạn cần xác định xem bộ sưu tập có "tóm tắt" hay không. Tất cả các giá trị số đều vốn có thể tóm tắt. Câu hỏi mà bạn nên hỏi thay vào đó là "Là' arg' một tập hợp các con số? ". Bạn có thể thử cung cấp các biến thể được gõ mạnh mẽ của 'Hành động' cho các kiểu số khác nhau hoặc các phôi thời gian trên' arg'. – Jon
Jon, cảm ơn vì đã trả lời. Tôi biết, các ví dụ tôi đã đưa ra đều là số ... Nhưng tôi thực sự muốn viết một cái gì đó chung chung và hữu ích hơn. Tôi không muốn viết một loạt các phôi thời gian có nhưng tôi đề nghị một tập hợp các hành động với các loại đối số khác nhau sẽ hoạt động ở đây ... –
Hãy xem xét các phương pháp có thể đếm được - nó có tập các phương thức chung được parametrized với từng loại hỗ trợ: 'Sum, Sum , Sum , Tổng >' vv Đó là cách duy nhất để thực hiện tham số kiểu là 'có thể summable' –