2010-10-21 7 views
2

J'ai List<T> et je veux trouver deux noms aléatoires de ce List<T> en commençant par une condition de la liste utilisant .NET 2.0.Utiliser le résultat du délégué comme entrée dans C# 2.0

Je sais très facile avec LINQ mais je suis coincé avec 2,0

Je me demande si je peux faire quelque chose comme ça

List<foo> list = new List<foo>(); 
List<foo> newlist = new List<foo>(); 
Random r = new Random(); 

list.Add(new foo("1")); 
list.Add(new foo("A91")); 
list.Add(new foo("A01")); 
list.Add(new foo("A71")); 
list.Add(new foo("B02")); 
list.Add(new foo("B2")); 
list.Add(new foo("B03")); 
list.Add(new foo("23")); 
list.Add(new foo("24")); 

string[] searchList = { "A", "B", "C",}; 

foreach (string name in searchList) 
{ 
    List<foo> templist = list.FindAll(delegate (foo f) 
         { 
          List<foo> templist1 = f.Name.StartsWith(name); 
          { 
           if(templist1.Count>0) 
           { 
            while (templist.Count != 0) 
           { 
            ??.Add(templist1[r.Next(templist1.Count)]); 

           } 
           retrun ?? 
          } 
         } 
         }); 


} 
+0

BTW, vous pouvez développer sur .NET 3.5 (par exemple en utilisant C# 3.0) presque sans compatibilité perdue (Les changements dans la .NET BCL entre 2.0 et 3.5 http://bit.ly/bDkD6Y/The Moth - .NET Framework 3.5 http://bit.ly/bd1AiD). Vous pouvez même utiliser LINQ juste déployer avec votre binaire System.Core assembly (support LINQ sur .NET 2.0 - http://bit.ly/cq6Gvj) –

+0

Pouvez-vous expliquer quelle valeur de retour vous attendez pour tempList, demandez-vous shuffled liste des valeurs qui commencent par le préfixe? –

+0

@Sam Saffron: Je veux deux valeurs de la liste où le nom commence par un b et c. Je suis templist d'attente devrait avoir 4 valeurs, deux valeurs aléatoires commencent par A et deux valeurs aléatoires commencent par B. – juniorCSharp

Répondre

0

Non return, mais yield return.

+0

n'est pas 'rendement rendement 'une fonctionnalité C# 3.0? – CodesInChaos

+0

Non, il semble que VS2005 (.net 2.0) le supporte. Cliquez sur le lien (je l'ai mis à jour) –

+0

Le rendement ne peut pas être utilisé dans une méthode anonyme (erreur du compilateur) (à partir de votre lien) – PostMan

1

En mettant de côté que la façon dont j'approche personnellement être limité à .NET 2.0 est en utilisant le 3,5 dll System.Core et la copie locale (comme mentionné par Nick Martyshchenko) ...

Le problème réel ici semble être que vous ne renvoyez pas le type correct dans votre délégué anonyme List<T>.FindAll prend un délégué Predicate<T>. Prédicat renvoie un bool.

List<T>.FindAll est pas comme la méthode LINQ où du tout. Ce n'est pas paresseux. Autrement dit, ce n'est pas un IEnumerable qui donne sur l'énumération. FindAll renvoie un List<T> (déjà énuméré).

Peut-être que je ne comprends pas vos besoins, mais pourquoi ne pas le faire:

List<foo> templist = list.FindAll(delegate (foo f) 
        { 
         bool itemStartsWith = f.Name.StartsWith(name); 

         if(itemStartsWith) 
         { 
          return true; 
         } 
         return false; 
        }); 
+0

Je peux être un malentendu mais je pense que l'op veut que cette liste soit mélangée après le fait –