2008-08-16 34 views
6

Tôi thích khả năng hiểu danh sách bằng Python, vì chúng biểu diễn chính xác một phép biến đổi danh sách.Thay thế cho ... nếu lặp lại mảng

Tuy nhiên, trong các ngôn ngữ khác, tôi thường xuyên thấy mình viết cái gì đó dọc theo dòng:

foreach (int x in intArray) 
    if (x > 3) //generic condition on x 
    x++ 
    //do other processing 

Ví dụ này là trong C#, nơi tôi thuộc LINQ ấn tượng có thể giúp với điều này, nhưng là có một số cấu trúc lập trình phổ biến có thể thay thế giải pháp hơi ít thanh lịch này? Có lẽ một cấu trúc dữ liệu tôi không xem xét?

Trả lời

5

các increment trong gốc foreach vòng lặp sẽ không ảnh hưởng đến nội dung của mảng, cách duy nhất để làm điều này vẫn còn là một vòng lặp for:

for(int i = 0; i < intArray.Length; ++i) 
{ 
    if(intArray[i] > 3) ++intArray[i]; 
} 

LINQ không có ý định thay đổi bộ sưu tập hoặc chuỗi đang tồn tại. Nó tạo ra các trình tự mới dựa trên các trình tự hiện có. Nó có thể đạt được các mã trên sử dụng LINQ, mặc dù nó là nhẹ so với mục đích của nó:

var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i)); 
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i)); 

Sử dụng where (hoặc tương đương), như thể hiện trong một số các câu trả lời khác, sẽ loại trừ bất kỳ giá trị nhỏ hơn hoặc bằng đến 3 từ chuỗi kết quả.

var intArray = new int[] { 10, 1, 20, 2 }; 
var newArray = from i in intArray where i > 3 select i + 1; 
// newArray == { 11, 21 } 

Có một phương pháp ForEach trên mảng mà sẽ cho phép bạn sử dụng một hàm lambda thay vì một khối foreach, dù cho bất cứ điều gì nhiều hơn một phương pháp gọi tôi sẽ gắn bó với foreach.

intArray.ForEach(i => DoSomething(i)); 
-1

Phụ thuộc vào ngôn ngữ và những gì bạn cần làm, "bản đồ" như được gọi bằng nhiều ngôn ngữ có thể là thứ bạn đang tìm kiếm. Tôi không biết C#, nhưng theo trang this, .NET 2.0 gọi bản đồ "ConvertAll".

Ý nghĩa của "bản đồ" khá đơn giản - lấy danh sách và áp dụng hàm cho từng phần tử của nó, trả về danh sách mới. Bạn cũng có thể tìm kiếm "bộ lọc", bộ lọc này sẽ cung cấp cho bạn danh sách các mục thỏa mãn vị từ trong danh sách khác.

0

trong Ruby:

intArray.select { |x| x > 3 }.each do |x| 
    # do other processing 
end 

hoặc nếu "xử lý khác" là một đoạn ngắn một liner:

intArray.select { |x| x > 3 }.each { |x| something_that_uses x } 

cuối cùng, nếu bạn muốn trả về một mảng mới có chứa các kết quả của quá trình xử lý các yếu tố đó lớn hơn 3:

intArray.select { |x| x > 3 }.map { |x| do_something_to x } 
1

Trong Python, bạn có filter and map, w hich như vậy có thể những gì bạn muốn:

map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray)) 

Ngoài ra còn có list comprehensions mà có thể làm cả hai trong một tuyên bố đơn giản:

[f(x + 1) for x in intArray if x > 3] 
2

Trong C# bạn có thể áp dụng chế chọn lọc trên bất cứ điều gì mà sống bên một IEnumerable như thế này:

intArray.Where(i => i > 3).ConvertAll(); 
DoStuff(intArray.Where(i => i 3)); 

Etc ..

0
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr)) 
Các vấn đề liên quan