2009-12-16 19 views
24

tengo una matriz de objetos (coches [] por ejemplo) y no es una propiedad isAvailable en el objetofiltro de una matriz en C#

quiero usar toda la gama (donde isAvailable es cierto para algunos artículos y falso para algunos otros) como la entrada y devolver una nueva matriz que incluye solo los artículos que tienen IsAvailable = true.

Respuesta

43

Si estás usando C# 3.0 o mejor ...

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

Y si usted no tiene acceso a LINQ (que está utilizando una versión anterior de .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

Considerando que la implementación LINQ se basa en IQueryable, ¿cómo podría su implementación ser mejor que la basada en la lista? – LorenVS

+0

IEnumerable *** (15chars) – LorenVS

+0

No lo es. Lo publiqué en caso de que el OP estuviera usando una versión anterior de .NET. Si el OP necesita el código de mayor rendimiento, al menos puede obtener la idea del segundo ejemplo ... y optimizarlo para satisfacer sus necesidades. –

1

manera más fácil:

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

posiblemente más eficiente:

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

Una solución sencilla es crear una nueva matriz, recorrer la matriz de entrada y añadir sólo aquellos elementos que cumplan sus condiciones a la nueva matriz, y devolver la nueva matriz:

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

usted tiene el foreach java creo ... – LorenVS

+0

Aww drat. Tiene razón =) – goatlinks

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

o

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

Puede omitir la comparación explícita contra '' 'true''', es decir:' '' var available = cars.Where (c => c.IsAvailable); '' ' –

-5

una matriz es array filtro cuando se cumple las siguientes condiciones:

  1. si 9 existe en la lista 13 también debe existir
  2. si 7 existe en la lista, 11 no debe existir

solución

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]); 
} 

como creo que este código es sin duda trabaje para si necesita probar una matriz.
reta seboka ambo universtity woliso campuse departamento de información TECH. !!

+0

Esto no se está filtrando una matriz. Esto devuelve si ciertos valores están en la matriz, de una manera muy mala. – Archer

10

Sorprendentemente, esta pregunta carece de respuesta más natural y eficaz: Array.FindAll

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

si fuera un List<Car> también hay un List.FindAll.

+0

He modificado tu introducción. No es gran cosa, pero espero haberlo entendido correctamente allí. – jpaugh