2009-03-13 9 views
1

J'ai une liste <> dans mon programme, rempli de ma classe personnalisée. Je veux être capable d'extraire un objet de la liste en spécifiant simplement un entier, puis en renvoyant tous les objets ayant une propriété entière à cet entier. Je pensais à le faire comme ceci:Comment obtenir un élément dans une liste <> en fonction d'un champ de nombres entiers?

int exampleint = 5; 
List<MyClass> extract = new List<MyClass>(); 
for(int i = 0; i < list.Length; i++) { 
    if(list[i].Number == exampleint) 
     extract.Add(list[i]); 
} 
return extract; 

Y a-t-il un moyen meilleur ou plus rapide de le faire? Je me demandais juste.

Mise à jour: Chris, votre réponse était un peu hors. Ce:

List<MyClass> extract = list.FindAll(delegate(int obj) { return obj.Number == exampleint; }); 

devrait en fait ceci:

List<MyClass> extract = list.FindAll(new Predicate<MyClass>(delegate(MyClass obj) { return obj.Number == exampleint; })); 

Votre premier exemple m'a donné des erreurs. Mais merci de m'avoir indiqué la bonne direction, cela semble fonctionner maintenant.

+0

Peut-on utiliser LINQ dans ce projet? –

+0

Content de pouvoir aider. C'est étrange, parce que j'ai utilisé et compilé comme je l'ai suggéré pendant plus d'un an sans problèmes. Il suffit de l'exécuter via Visual Studio et il ne s'est pas plaint. Eh bien, ReSharper se plaint, me disant de le convertir en lambda, mais il se compile parfaitement avec la version déléguée. –

+0

L'une des erreurs que j'ai réalisées seule était la partie "obj.Number". Il n'y a aucun membre nommé Number dans un Int32. – Bevin

Répondre

7
List<MyClass> extract = list.FindAll(obj => obj.Number == exampleint); 

OU (si vous utilisez .NET 2.0 et ne peut pas utiliser des expressions)

List<MyClass> extract = list.FindAll(delegate(MyClass obj) { return obj.Number == exampleint; }); 
+0

+! C'est plus élégant que le mien :) J'oublie toujours FindAll. –

+0

Merci! J'utilise 2.0, aurait probablement dû le dire. – Bevin

+0

obj doit être un configurateur MyClass – configurator

0

Si vous utilisez C# 3:

 
return (from e in list 
     where e.Number == exampleint 
     select e).ToList(); 

Cela exécutera une requête LINQ qui les sort, convertit ensuite à une liste. Si vous pouvez renvoyer IEnumerable à la place, vous pouvez éviter l'appel ToList().

0

Utiliser des méthodes Linq/extension:

var result = list.Where(x => x.PropertyValue == YourSelectedValue); 
0

Si vous pouvez utiliser Linq:

Liste extrait = existingList.Where (x => x.Number == exampleInt) .ToList();

1

Si vous avez seulement C# 2, essayez ceci:

public delegate bool Predicate<T>(T item); 

public static IEnumerable<T> Where(IEnumerable<T> source, Predicate pred) 
{ 
    foreach (T item in source) 
    { 
     if (pred(item)) 
      yield return item; 
    } 
} 

Vous peut réutiliser que lorsque vous avez ce genre de besoin de filtrage, comme ceci:

IEnumerable<MyClass> filtered = Where(list, delegate(MyClass c) { return c.Number == exampleint; }); 

Il est essentiellement identique aux solutions Linq et vous permettra de vous familiariser avec ce style de traitement de liste prêt pour la mise à jour de votre compilateur.

Questions connexes