2010-11-12 34 views
17

LƯU Ý: Trước khi bạn đọc hoặc cung cấp câu trả lời, tôi biết về Enumerable.Distinct, tôi hỏi về hỗ trợ ngôn ngữ cụ thể cho phương thức đó, không phải về chính phương thức đó.Tại sao LINQ không bao gồm từ khóa `khác biệt`?

Tôi luôn tự hỏi tại sao không có distinct từ khóa trong C# LINQ từ khóa thiết lập để cho tôi có thể viết:

var items = distinct from x in y 
      select x; 

hoặc

var items = from x in y 
      select distinct x; 

Bất kỳ ai biết tại sao điều này không bao gồm hoặc tại sao nó sẽ là một ý tưởng tồi để bao gồm nó? Nó chỉ cảm thấy cồng kềnh với tôi rằng tôi phải quấn truy vấn chỉ để gọi Distinct(); một từ khóa distinct sẽ cảm thấy tự nhiên hơn.

LƯU Ý: Tôi biết rằng phương pháp Distinct có ghi đè để cung cấp bộ so sánh nếu cần, nhưng từ khóa sử dụng trình so sánh mặc định sẽ là tuyệt vời. Tôi thậm chí có thể tưởng tượng một sự kết hợp từ khóa distinct by để một toán tử so sánh có thể được cung cấp nội tuyến cho truy vấn.

+1

Tôi muốn chúng tôi đã có nó quá. Sẽ dễ đọc hơn nhiều, và nó được sử dụng hợp lý. –

+0

@qstarin: Tôi đã đặt câu hỏi vì tôi cần nó lần thứ 5 trong 2 ngày. –

+0

Có lẽ chúng ta nên bắt đầu một nhóm từ khóa "riêng biệt cho C#". Nó có Betty White trên SNL ... –

Trả lời

10

Charlie Calvert có một số blog post ("Using Distinct and Avoiding Lambdas") thảo luận vấn đề. Từ phía trên cùng của bài:

  1. Hầu hết các nhà khai thác truy vấn như Select(), Where()GroupBy() mất một cái gì đó gọi là lambda như một tham số.
  2. Lambdas khó viết.
  3. Biểu thức truy vấn được tạo ra một phần lớn để cho phép các nhà phát triển sử dụng LINQ mà không cần phải tìm hiểu cú pháp phức tạp liên quan đến lambdas.
  4. Một vài toán tử truy vấn, chẳng hạn như Distinct(), không lấy lambdas làm tham số. Kết quả là, họ rất dễ gọi.
  5. Biểu thức truy vấn do đó không được tạo cho các toán tử như Distinct() không sử dụng lambdas.

Và cũng có thể, từ tiếp tục xuống trong bài:

khai thác Query là lời gọi phương thức. Nói cách khác, có các phương pháp trong API LINQ được gọi là Select(), Group(), Distinct(), v.v. Chúng tôi thường không gọi những phương thức này trực tiếp vì chúng lấy lambdas làm tham số và nhiều người thấy rằng lambdas khó hiểu. Để giúp các nhà phát triển tránh được nhiệm vụ phức tạp của việc viết lambdas, nhóm phát minh ra các biểu thức truy vấn, đó là một "cú pháp cú pháp" nằm trên đầu trang của lambdas.

TL; DR: Không có từ khóa distinct để đơn giản, vì distinct không mất một biểu thức lambda.

+2

Câu trả lời hay, cảm ơn. Đó là tất cả các âm thanh tuyệt vời, nhưng nó không phù hợp với CÁCH người sử dụng công cụ này. Nó sẽ cực kỳ hữu ích và làm cho mọi thứ trở nên dễ đọc hơn rất nhiều. Tôi không nghĩ rằng lập luận được đưa ra bởi Charlie Calvert thực sự là mạnh mẽ - đặc biệt là kể từ khi từ khóa WS được bao gồm cho VB. –

+6

"Chúng tôi thường không gọi những phương pháp này trực tiếp bởi vì họ lấy lambdas làm thông số, và nhiều người lập trình tệ hại không xứng đáng với muối của họ ** thấy rằng lambdas khó hiểu" - FTFY. – Juliet

+2

Hoàn toàn đồng ý với cả hai bạn. Lambdas không phải là khó khăn, và tôi đã bị vấp ngã bởi điều này trước đây - "chờ đã, vì vậy có một phương thức' khác biệt() 'nhưng không có từ khóa' khác biệt'? " Làm tôi cảm thấy rất ít. – Donut

14

Trong VB, có thực tế .

Dim l = From x In {1, 2, 3, 2, 4, 2} Distinct Select x 

Tôi không nghi ngờ có một số quyết định tích cực chống lại distinct cho C#, nó chỉ chưa được triển khai.

+0

Tất nhiên, tôi không muốn phải viết tất cả LINQ của tôi trong VB. :) –

+2

VB cũng hỗ trợ 'Take' và' Skip' trong định dạng truy vấn. –

+0

VB cũng có 'Tổng hợp ... Vào' trong định dạng truy vấn? Điều này có tồn tại trong C# không? – Dario

5

Reword: distinct là toán tử thiết lập ... toán tử thiết lập không sử dụng lambdas làm tham số. Nhóm C# đã quyết định cung cấp cho bạn các phím tắt cho các phương thức dùng lambdas, chẳng hạn như Select()Group(), bởi vì họ cảm thấy rằng lambdas có thể gây nhầm lẫn cho những người mới bắt đầu. .Distinct() không dùng lambda, vì vậy rõ ràng khi bạn gọi trực tiếp.

Một tốt đọc về đề tài này:
http://blogs.msdn.com/b/charlie/archive/2006/11/19/linq-farm-group-and-distinct.aspx

+1

Điều đó giải thích sự khác biệt, nhưng tôi vẫn không nghĩ rằng nó trả lời câu hỏi. 'in' không sử dụng lambda. Đó là một sự tiện lợi. Các đối số là thiếu sót, đặc biệt là khi thấy rằng VB có từ khóa. Tôi nghĩ rằng biện minh là yếu - đó không phải là chỉ trích câu trả lời của bạn khi bạn đang chuyển tiếp thông tin, nhưng bạn nhận được quan điểm của tôi. –

+0

Được đánh giá lại. Bạn nói đúng, điều quan trọng là nó chỉ là một tiện lợi. Nhóm C# đã quyết định không cần một sự thuận tiện trên '.Distinct()' (Rõ ràng là nhóm VB không đồng ý) –

+1

Tôi nghĩ họ đã đưa ra quyết định kém liên quan đến sự khác biệt. –

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