2010-01-04 4 views
1

J'ai beaucoup de collections dans une application, et il m'est apparu que tous les objets ont un champ "Nom" similaire dans mon programme. Donc, je voulais faire quelque chose comme ça ...this [nom de la chaîne] dans Generic Collection

public partial class Listable<T> : List<T> where T : IListable 
{ 
    public T this[string name] 
    { 
     get { // ..... ? 
     set; 
    } 
} 

... Mais je suis un peu coincé à l'endroit où aller à partir de là. Comment puis-je itérer la collection dont je hérite en cours? Je veux dire, sûrement la liste des éléments de la classe de base sera itérée, n'est-ce pas?

Ceci est dans .NET 3.5.

+0

Est-ce .NET 3.5? – ChaosPandion

+0

Oui, il s'agit de .NET 3.5. – Ciel

+0

foreach x dans ce? –

Répondre

4

Puisque vous héritez de la liste que vous pouvez faire ceci:

return this.Single(l => l.Name == name); // Throws exception 

Ou

return this.SingleOrDefault(l => l.Name == name); // Returns null 

Comme LBushkin mentionné, sauf si vous voulez vraiment ajouter plus de fonctionnalités que vous pouvez continuer à utiliser

List<IListable> 

Ensuite, vous pouvez simplement faire l'appel comme ceci:

var item = list.Single(l => l.Name == "Jim"); 

Enfin, vous voudrez peut-être considérer l'objet Dictionnaire:

var v = new ListableItem("Jim"); 
var items = new Dictionary<String, IListable>(); 

items.Add(v.Name, v); 

IListable result; 

result = items["Jim"]; // Object.ReferenceEquals(result, v) == true 
result = items["Matt"]; // Throws KeyNotFoundException 

if (!items.TryGetValue("Matt", out result)) 
{ 
    // Matt is not in the dictionary 
} 
+0

Merci, c'est parfait. Je pense que je peux également explorer l'idée du dictionnaire, comme indiqué ci-dessus. – Ciel

+0

Oui, la solution de dictionnaire vous donnera les meilleures performances. – ChaosPandion

+0

Est-il possible d'utiliser un setter de la même manière? – Ciel

3

Puisque vous semblez avoir déjà une interface chaque outils de type, vous pouvez éviter d'utiliser une collection spéciale, et utiliser LINQ pour effectuer la Chercher. Vous pouvez également envisager d'utiliser un dictionnaire plutôt qu'une liste, si votre cas d'utilisation principal est la recherche d'objet par nom. Si vous choisissez de créer un dictionnaire, vous devez vous assurer que la propriété Name de ces objets est immuable, sinon vous risquez de trouver le mauvais élément (ou aucun élément) lorsque vous effectuez la recherche.

public interface IListable { string Name { get; } } // assumed interface 

public class SomeType : IListable { ... } 

var listObjects = new List<SomeType>() { /* populate collection */ }; 
var foundObject = listObjects.Where(x => x.Name == "theNameToFind") 
          .SingleOrDefault(); 

Vous pouvez, bien sûr, créer votre propre méthode d'extension pour en faire une seule opération en ligne:

public static class ListExt 
{ 
    public static T Find<T>(this IList<T> list, string name) where T : IListable 
    { 
     return list.Where(x => x.Name == name).SingleOrDefault(); 
    } 
} 

// we can now do this: 
var listObjects = new List<SomeType>() { /* populate collection */ }; 
var item = listObjects.Find("nameToFind"); 
2

Vous devriez juste être en mesure d'utiliser this de se référer à la liste et itérer dessus :

foreach (IListable item in this) 
{ 
    if (item.Name == name) 
    { 
     // ... 
    } 
}