2009-12-16 34 views
24

tôi có một mảng các đối tượng (xe [] ví dụ) và có một IsAvailable tài sản trên đối tượnglọc một mảng trong C#

tôi muốn sử dụng các mảng đầy đủ (nơi IsAvailable là đúng đối với một số mặt hàng và false cho một số người khác) làm đầu vào và trả về một mảng mới chỉ bao gồm các mục có IsAvailable = true.

Trả lời

43

Nếu bạn đang sử dụng C# 3.0 hoặc tốt hơn ...

public Car[] Filter(Car[] input) 
{ 
    return input.Where(c => c.IsAvailable).ToArray(); 
} 

Và nếu bạn không có quyền truy cập vào LINQ (bạn đang sử dụng một phiên bản cũ của .NET) ...

public Car[] Filter(Car[] input) 
{ 
    List<Car> availableCars = new List<Car>(); 

    foreach(Car c in input) 
    { 
     if(c.IsAvailable) 
      availableCars.Add(c); 
    } 

    return availableCars.ToArray(); 
} 
+0

Xem xét việc triển khai LINQ được xây dựng trên IQueryable, cách triển khai LINQ của nó có thể tốt hơn gì so với danh sách dựa trên Danh sách? – LorenVS

+0

Có thể đếm được *** (15chars) – LorenVS

+0

Không. Tôi đã đăng nó trong trường hợp OP đang sử dụng phiên bản .NET cũ hơn. Nếu OP cần mã hiệu năng nhất, họ ít nhất có thể lấy ý tưởng từ ví dụ thứ hai ... và tối ưu hóa nó cho phù hợp với nhu cầu của họ. –

1

dễ nhất cách:

Car[] cars = //... 
Car[] filtered = cars.Where(c => c.IsAvailable).ToArray(); 

Có thể hiệu quả hơn:

Car [] cars = //... 
    List<Car> filteredList = new List<Car>(); 
    for(int i = 0; i < cars.Length; i++) 
    { 
     if(cars[i].IsAvailable) 
      filteredList.Add(cars[i]); 
    } 
    Car[] filtered = filteredList.ToArray(); 
1

Một giải pháp đơn giản là tạo ra một mảng mới, lặp qua mảng đầu vào và thêm chỉ những mặt hàng đáp ứng điều kiện của bạn đến các mảng mới, và trả lại mảng mới:

List<Car> available = new List<Car>(); 
foreach (Car c in cars) { 
    if (c.IsAvailable) { 
     available.add(c); 
    } 
} 
//Here you can either just return the list, or create an array from it. 
+0

bạn có java foreach tôi tin rằng ... – LorenVS

+0

Aww drat. Bạn đúng =) – goatlinks

0
var available = from c in cars where c.IsAvailable == true select c; 

hoặc

var available = cars.Where(c => c.IsAvailable == true); 
+1

Có thể bỏ qua so sánh rõ ràng với '' 'true''', tức là:' '' var available = cars.Where (c => c.IsAvailable); '' ' –

-5

một mảng là mảng lọc khi nó đáp ứng các điều kiện sau đây:

  1. nếu 9 tồn tại trong danh sách 13 cũng phải tồn tại
  2. nếu 7 tồn tại trong danh sách sau đó 11 không phải tồn tại

giải pháp

int[] a = {7 , 72, 6, 13, 9 }; 
int i, k = 0, l = 0, m = 0, n = 0; 
for (i = 0; i < a.Length; i++) 
{ 
    if (a[i] == 9) 
    { 
     k = 1; 
    } 
} 
for (i = 0; i < a.Length; i++) 
{ 
    if (a[i] == 13) 
    { 
     l = 1; 
    } 
} 
for (i = 0; i < a.Length; i++) 
{ 
    if (a[i] == 7) 
    { 
     m = 1; 
    } 
} 
for (i = 0; i < a.Length; i++) 
{ 
    if (a[i] == 11) 
    { 
     n= 1; 
    } 
} 
if ((k == 1 && l == 1) && (m == 1 && n == 1)) 
{ 
    Console.WriteLine("is not filter array"); 
} 
else if (k == 1 && l!= 1) 
{ 
    Console.WriteLine("is not filter array"); 
} 
else if (m ==1 && n==1) 
{ 
    Console.WriteLine("is not filter array "); 
} 
else 
    Console.WriteLine("is filter array"); 
Console.WriteLine("the element of an array is:"); 
for (i = 0; i < a.Length; i++) 
{ 
    Console.WriteLine(a[i]); 
} 

Như tôi nghĩ rằng mã này là chắc chắn làm việc cho nếu bạn cần kiểm tra một mảng.
reta seboka ambo universtity woliso bộ phận cắm trại của thông tin TECH. !!

+0

Đây không phải là lọc một mảng. Điều này đang trả về cho dù các giá trị nhất định có nằm trong mảng hay không, theo cách rất xấu. – Archer

10

Đáng ngạc nhiên, câu hỏi này thiếu câu trả lời tự nhiên và hiệu quả nhất: Array.FindAll

Car[] availableCars = Array.FindAll(cars, c => c.IsAvailable); 

nếu đó là một List<Car> đó cũng là một List.FindAll.

+0

Tôi đã chỉnh sửa phần giới thiệu của bạn. Không có vấn đề gì, nhưng tôi hy vọng tôi hiểu chính xác bạn ở đó. – jpaugh

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