2013-10-04 15 views
5

* Mặc dù đây là câu hỏi trùng lặp, tôi chưa bao giờ thấy biểu thức "=>" trong mã trước đó. Nếu tôi biết điều này đặc biệt là một biểu thức lambda, tôi sẽ có google'd và figured nó ra trên của riêng tôi. Cảm ơn!=> có nghĩa là gì trong Biểu thức LINQ

Tôi mới để sử dụng LINQ, vì vậy việc sử dụng "=>" thực sự bối rối cho tôi khi tôi chạy qua nó trong mã này:

using System; 
using System.Linq; 
using System.Collections.Generic; 

public static class Extend 
{ 
    public static double StandardDeviation(this IEnumerable<double> values) 
    { 
     double avg = values.Average(); 
     return Math.Sqrt(values.Average(v=>Math.Pow(v-avg,2))); 
    } 
} 

Nguồn: Standard deviation of generic list?

Một vài câu hỏi sau: => làm gì ở đây? Intellisense nói với tôi rằng 'v' là một int, nhưng nó chưa bao giờ được khai báo. Cái này hoạt động ra sao?

+3

Google lambda's .NET. Đó là một chủ đề lớn, nhưng bạn có thể dễ dàng đọc lên nó. –

Trả lời

8

Ký hiệu này => nghĩa biểu thức lambda

dụ:

Enumerable.Range(0,100).Where(x=>x==1); 

đây x=> x==1 là một đại biểu vô danh nhận int như một tham số và trả về bool. Đó là:

delegate bool SomeDelegate(int x); 

và bạn có thể gán cơ thể của đại biểu đến:

bool Function(int x) 
{ 
    return x==1; 
} 

Một biểu thức lambda là một chức năng ẩn danh mà bạn có thể sử dụng để tạo đại biểu hoặc các loại cây biểu thức. Bằng cách sử dụng các biểu thức lambda , bạn có thể viết các hàm cục bộ có thể được chuyển thành đối số hoặc được trả về dưới dạng giá trị của các cuộc gọi hàm. Biểu thức Lambda đặc biệt hữu ích khi viết các truy vấn LINQ .

Để tạo biểu thức lambda, bạn chỉ định tham số đầu vào (nếu có) ở phía bên trái toán tử lambda => và bạn đặt biểu thức hoặc khối câu lệnh ở phía bên kia. Ví dụ: biểu thức lambda x => x * x chỉ định tham số có tên là x và trả về giá trị của x bình phương. Bạn có thể gán biểu thức này cho một loại đại biểu , như ví dụ sau đây cho thấy:

nguồn: Read about lambda expressions

Dưới đây là một câu hỏi SO về việc tại sao phải sử dụng lambdas: C# Lambda expressions: Why should I use them?

+9

Tôi không thể tin rằng một bản sao thẳng-dán từ wikipedia có nhiều upvotes. Ngoài ra câu hỏi khá dễ dàng và có thể được đóng lại –

+0

@TonyTheLion 1. Nó không phải là wikipedia 2. Tôi là ví dụ phù hợp với prepairing, mà bây giờ có thể tìm thấy trong câu trả lời của tôi – wudzik

+0

Toán tử => có thể được sử dụng theo hai cách trong C#: Là toán tử lambda trong một biểu thức lambda, nó tách các biến đầu vào khỏi cơ thể lambda. Trong định nghĩa nội dung biểu thức, nó phân tách tên thành viên từ việc triển khai thành viên. –

1

=> là ký hiệu cho số Lamdba expression, về cơ bản là cách viết tắt bằng cách viết một phương thức ẩn danh :)

Nó cũng sẽ tự động suy ra các loại nó có thể, vì vậy đó là lý do tại sao v không bao giờ được khai báo là một int, nhưng được hiểu bởi trình biên dịch là một int anyway.

+4

điều này có thể là một bình luận không phải là một câu trả lời – apomene

+1

Tôi nghĩ rằng đó là khắc nghiệt. Vấn đề với => là khó tìm kiếm nếu bạn không biết nó làm gì với biểu thức Lambda – guymid

+0

chỉ liên kết câu trả lời ... – ChrisWue

6

nhà điều hành => không liên quan gì đến linq - đó là lambda expression. Nó được sử dụng để tạo ra các chức năng ẩn danh, do đó bạn không cần phải tạo ra một chức năng đầy đủ cho mọi điều nhỏ nhặt.

nên các biểu hiện:

s => s + 5 

có thể được dịch sang:

int fun(int s) 
{ 
return s + 5; 
} 
1

Bạn cũng có thể đọc this very short article, nó là một bản tóm tắt rất tốt của một biểu thức lambda là gì, làm thế nào để sử dụng nó và khi.

Các ví dụ đưa ra là

List<int> numbers = new List<int>{11,37,52}; 
List<int> oddNumbers = numbers.where(n => n % 2 == 1).ToList(); 
//Now oddNumbers is equal to 11 and 37 

tại dòng 2, oddNumbers bây giờ là tương đương với số nơi number % 2 bằng 1, vì vậy mà số là số lẻ

1

Để hiểu rõ hơn này. Tôi sẽ viết lại mã của bạn mà không có LINQ như sau:

public static class Extend 
    { 
     public static double StandardDeviation(this IEnumerable<double> values) 
     { 
      double avg = values.Average(); 
      var newValues = new List<double>(); 
      foreach (var v in values) 
      { 
       newValues.Add(Math.Pow(v - avg, 2)); 
      } 

      return Math.Sqrt(newValues.Average()); 
     } 
    } 

Bây giờ bạn có thể so sánh hai phiên bản mã này và xem mối quan hệ.

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