2012-11-15 41 views
5

Tôi có một TimePoint struct tương tự như một điểm ngoại trừ giá trị x là datetime, một bộ sưu tập quan sát các timepoint và phương pháp này datetime và trả về một giá trị kép.LINQ - C# - Sử dụng lambda - Lấy một tập hợp dữ liệu từ Bộ sưu tập

Tôi muốn truy xuất giá trị tối đa và tối thiểu của số đôi được trả về từ số liệu thống kê trong bộ sưu tập này.

Tôi mới tham gia LINQ và không thể tìm ra truy vấn tôi sẽ phải chuyển sang bộ sưu tập quan sát để đạt được điều này.

Dưới đây là những gì tôi đang cố gắng để có được:

double minDouble = 0; 
double maxDouble = 0; 

foreach(TimePoint item in obsColl) 
{ 
    var doubleVal = ConvertToDouble(item.X); //Here x is a datetime 
    if(minDouble > doubleVal) 
     minDouble = doubleVal; 
    if(maxDouble < doubleVal) 
     maxDouble = doubleVal; 
} 

Làm thế nào tôi có thể đạt được điều này bằng cách dùng LINQ? Hay LINQ không lý tưởng cho việc này?

Trả lời

4

Bạn có thể sử dụng MaxMin cho việc này:

double minDouble = obsColl.Min(item => ConvertToDouble(item.X)); 
double maxDouble = obsColl.Max(item => ConvertToDouble(item.X)); 
+0

này sẽ gây ra một lặp nội bộ về toàn bộ bộ sưu tập? Những gì tôi có nghĩa là nếu tôi chạy Min một lần và tối đa một lần, nó là một hiệu suất O (n) hai lần? – Harsha

+0

@Harsha vâng, đó là sự hiểu biết của tôi - nó sẽ lặp lại toàn bộ bộ sưu tập (mặc dù tất cả những gì tôi biết có thể có một số loại tối ưu được tích hợp sẵn). Các phương thức Linq như 'Max' và' Min' là các phương thức mở rộng của 'IEnumerable', do đó, ở phần lõi của chúng, bạn có thể giả sử chúng đơn giản thực hiện một phép lặp. – McGarnagle

2

Đó là hiệu quả hơn

double minDouble =ConvertToDouble(obsColl.Min(item => item.X)); 
    double maxDouble = ConvertToDouble(obsColl.Max(item => item.X)); 
3

bạn có thể đi qua những ví dụ này 101 LINQ Samples

+1

+1 Cuối cùng, một người khác muốn mọi người tự giúp mình bằng đúng tài liệu. : o) – DHN

+1

@Groo cảm ơn, đã sửa liên kết – makc

0

Sử dụng gói khẳng định thông thạo

[Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod] 
    public void MyTestMethod() 
    { 
     var list = new List<double>() { 1, 3, 5, 2, 9, 4 }; 

     var minmax = from l in list 
        group l by 1 into g 
        select new 
        { 
         min = g.Min(), 
         max = g.Max() 
        }; 

     minmax.First().min.Should().Be(1); 
     minmax.First().max.Should().Be(9); 
    } 

Bây giờ l nhóm 1 vào g là một hack vì LINQ sẽ không phép uẩn không có nhóm nhưng nó không phải là quá xấu

+0

Điều đó đang được nói rằng thuật toán nội bộ có thể sử dụng hai vòng mà trong foreach của bạn, bạn có thể quản lý chỉ một. Nếu hiệu suất là một vấn đề cho bạn, hãy lập cấu hình cho hai giải pháp và chọn giải pháp tốt hơn. – bradgonesurfing

Các vấn đề liên quan