2011-08-25 22 views
5

Ive được investiging thư viện Rx và đã cố gắng tái tạo ví dụ từ video sau ...Rx Lết chức năng

http://channel9.msdn.com/blogs/j.van.gogh/writing-your-first-rx-application

nó tất cả các công trình (với một số sửa đổi để mọi thứ đã được thay đổi/phản đối) lên cho đến khi ông được sử dụng ...

.Let(mm => ...) 

này ném một lỗi biên dịch nói rằng không có định nghĩa cho let, vì vậy tôi cho rằng Lết đã được đổi thành cái gì khác, hoặc gỡ bỏ hoàn toàn, nhưng tôi không thể tìm thấy bất kỳ giải pháp từ một googling.

Vì vậy, không ai biết phải sử dụng gì trong trường hợp này?

Trả lời

0

Hãy tiếp tục, tính năng này có hiệu quả với bạn không?

var observable = new Subject<int>(); 
observable.Let(mm => mm); 

Có thể bạn đã quên nhập không gian tên? (System.Reactive.Linq)?

+0

Xin chào, không có điều gì không hoạt động và tôi đã thêm rằng sử dụng câu lệnh, có lẽ nó nằm trong một số assembly mà tôi đã tham chiếu? Ive tham chiếu sau đây ... System.Reactive, System.Reactive.Providers, System.Reactive.Windows.Threading – electricsheep

+0

Nó trong hội đồng System.Reactive. Bạn đang sử dụng phiên bản RX nào và trên nền tảng nào? – chrisaut

+0

đây là một ứng dụng WPF và phiên bản của nó tôi nhận được từ NuGet – electricsheep

1

Hãy thử sử dụng cách khác .Chọn và chiếu loại bao gồm cả biến mới của bạn và giá trị quan sát được đến.

1

Có thể bạn đang cố sử dụng EnumerableEx.Let đã bị xóa khỏi Phiên bản thử nghiệm hiện tại của Tiện ích mở rộng tương tác. Họ sẽ đưa nó trở lại trong

Trong khi đó bạn có thể định nghĩa nó cho mình một cách dễ dàng như vậy:.

public static class EnumerableExx 
{ 
    public static U Let<T,U>(this T source, Func<T,U> f) 
    { 
     return f(source); 
    } 
} 

Lưu ý rằng phiên bản này hoạt động với bất kỳ loại không chỉ IEnumerable.

Bạn cũng có thể sử dụng Memoize (...) thay vì có thể tốt hơn vì nó lưu trữ bộ sưu tập ở phía bên tay trái.

1

Let chỉ cho phép bạn đặt biểu thức tên riêng để bạn có thể sử dụng lại sau này mà không phải sử dụng biến cục bộ. Bạn luôn có thể tách một biểu thức Rx thành nhiều phần và gán các phần đó cho các biến cục bộ. Bạn có thể gửi truy vấn ban đầu và tôi sẽ chỉ cho bạn cách để bỏ qua nó?

6

Theo đề xuất của Jim Wooley.

Tôi nghĩ rằng mã bạn đang xem xét là

var q = from start in mouseDown 
    from delta in mouseMove.StartWith(start).Until(mouseUp) 
    .Let(mm=> mm.Zip(mm.Skip(1), (prev, curr) => 
       new { X = curr.X - prev.X, Y = curr.Y - prev.Y})) 
    select delta; 

Hãy nhớ rằng đã được viết vào năm 2009 và Rx có di chuyển dọc theo một số kể từ đó. Tôi nghĩ rằng đây là những gì bạn muốn. Tôi nghĩ rằng Let là một tính năng bạn muốn tránh (ngay cả khi có sẵn cho bạn) trong Rx vì nó có thể khuyến khích các tác dụng phụ. Sử dụng phép biến đổi với Chọn thay thế. Trong trường hợp dưới đây, cho phép là không cần thiết.

//Gets the delta of positions. 
var mouseMovements = mouseMove.Zip(mouseMove.Skip(1), (prev, curr) => 
       new { X = curr.X - prev.X, Y = curr.Y - prev.Y})); 
//Only streams when mouse is down 
var dragging = from md in mouseDown 
       from mm in mouseMovement.TakeUntil(mouseUp) 
       select mm; 
Các vấn đề liên quan