web-dev-qa-db-fra.com

filtrer un tableau en C #

j'ai un tableau d'objets (Car [] par exemple) et il y a une propriété IsAvailable sur l'objet

je veux utiliser le tableau complet (où IsAvailable est true pour certains éléments et false pour d'autres) comme entrée et renvoyer un nouveau tableau qui inclut uniquement les éléments dont IsAvailable = true.

31
leora

Si vous utilisez C # 3.0 ou mieux ...

using System.Linq;

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

Et si vous n'avez pas accès à LINQ (vous utilisez une ancienne version 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();
}
52
Justin Niessner

Étonnamment, cette question manque de la réponse la plus naturelle et efficace: Array.FindAll

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

s'il s'agissait d'un List<Car>, il existe également un List.FindAll .

16
Rango

Manière la plus simple:

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

Peut-être plus efficace:

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
LorenVS

Une solution simple consiste à créer un nouveau tableau, à parcourir le tableau en entrée et à ajouter uniquement les éléments satisfaisant vos conditions au nouveau tableau, puis à renvoyer le nouveau tableau:

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.
1
goatlinks
var available = from c in cars where c.IsAvailable == true select c;

Ou

var available = cars.Where(c => c.IsAvailable == true);
0
Jim Wallace