2010-04-08 3 views
1

Je veux stocker une liste d'objets, disons de type Car, mais avec une propriété 'tag' supplémentaire, par exemple un booléen True/False qui n'appartient pas à la classe Car. Quelle est la meilleure façon d'y parvenir? Je dois passer le résultat entre les méthodes.Liste des objets plus une étiquette

+0

Est-ce que chaque voiture a besoin d'une étiquette? Ou est-ce que la collection de voitures a besoin d'un tag? –

+0

Comment voulez-vous que le tag se comporte? Voulez-vous obtenir des voitures de la liste par étiquette? Souhaitez-vous obtenir une paire de voiture/étiquette de la liste et traiter chaque paire individuellement? –

+0

Chaque voiture a besoin d'une balise –

Répondre

2

Vous pouvez utiliser un type de ligne, par exemple Pair<T,U>.

Heres un exemple:

namespace TestProject.Utils 
{ 
    public class Pair<T, U> 
    {  
     public Pair(T first, U second) 
     { 
      this.First = first; 
      this.Second = second; 
     } 

     public T First { get; set; } 
     public U Second { get; set; } 
    } 
} 

Pour C# 4, voici une bonne lecture à propos tuple: CLR Inside Out - Building Tuple

EDIT: Utilisation

Car mustang; 
List<Pair<Car, bool>> list = new List<Pair<Car, bool>>(); // <Car, isAwesome> pairs.. 
list.Add(new Pair(mustang, true)); 
+0

C'est une bonne idée, mais ... si je récupère la liste des voitures puis que je veux ajouter la balise par la suite, je vais devoir convertir des objets d'un type de liste à un autre. Et je dois déjà recommencer plus tard. Est-ce une mauvaise pratique de convertir des listes ou un scénario commun? –

0
Dictionary<Car, bool> carFlags = new Dictionary<Car, bool>(); 

Vous pouvez passer la voiture dans le dictionnaire et récupérer le drapeau bool.

0

Utilisation de l'héritage, vous pouvez créer une classe CarWithTag qui étend la classe de voiture sans polluer la classe de voitures avec des propriétés non nécessaires:

public class Car 
{ 
    public string CarInfoEtcetera { get; set; } 
} 

public class CarWithTag : Car 
{ 
    public string Tag { get; set; } 
} 

Ensuite, vous pouvez créer une méthode qui accepte un objet CarWithTag lorsque vous devez passer tag info aussi.

private string GetCarTagInfo(CarWithTag car) 
    { 
     return car.Tag; 
    } 

Vous pouvez maintenant créer un nouvel objet CarWithTag et le transmettre dans la méthode, ainsi que toutes les infos de voiture.

 CarWithTag carWithTag = new CarWithTag() 
            { 
             Tag = "123abc", 
             CarInfoEtcetera = "etc" 
            }; 

     string tag = GetCarTagInfo(carWithTag); 
Questions connexes