Comment puis-je effectuer un FindAll () sur un IList < T > ;? (par exemple, SortedList.Values)

StackOverflow https://stackoverflow.com/questions/617374

  •  03-07-2019
  •  | 
  •  

Question

Je travaille sur un problème dans C # 2.0 / .NET 2.0 où j'ai une liste triée et que je veux rechercher dans toutes les " valeurs " (pas les "clés") de cette liste triée pour une certaine sous-chaîne et comptez le nombre d’occurrences.

C'est ce que j'essaie de faire:

{
   Sortedlist<string,string> mySortedList;
   // some code that instantiates mySortedList and populates it with data
   List<string> myValues = mySortedList.Values;  // <== does not work
   int namesFound = myValues.FindAll(ByName(someName)).Count;
}

Naturellement, cela ne fonctionne pas car mySortedList.Values ??renvoie une liste IList, alors que "myValues" est une liste. J'ai essayé le "casting". l'IList pour qu'il soit accepté par myValues, mais cela ne semble pas fonctionner.

Bien sûr, je peux passer en boucle sur mySortedList.Values ??dans un "foreach". boucle, mais je ne veux pas vraiment faire cela.

Quelqu'un a-t-il des suggestions?

EDIT-1: Bien, il semble qu’il n’existe pas de méthode native pour le faire facilement. J'avais supposé qu'il me manquait quelque chose, mais apparemment je ne le suis pas. Donc, je suppose que je vais juste faire un "foreach" sur l'IList.

Merci à tous pour vos commentaires! J'ai voté pour tout le monde 1 parce que je pensais que tous les commentaires étaient bons. Merci encore! : -)

EDIT-2: On dirait que CMS a la réponse que je cherchais. Le seul inconvénient à cela (comme Qwertie l'a souligné) est qu'il existe une pénalité potentielle en termes de performances puisqu'il consiste à copier toutes les valeurs dans une autre liste, puis à effectuer une recherche de bout en bout dans cette liste. Donc, pour les listes restreintes, cette réponse est efficace. Des listes plus longues? eh bien c'est à vous de décider ...

Était-ce utile?

La solution

Depuis la Interface IListe implémente IEnumerable , vous pouvez réellement obtenir une liste < T > de valeurs à l'aide du liste < T > (IEnumerable) Constructeur :

List<string> myValues = new List<string>(mySortedList.Values);

Autres conseils

Vous ne pouvez pas convertir la propriété Values ??en Liste < string > car il ne s'agit pas d'une liste < string > - il s'agit d'un dictionnaire < TKey, TValue > .ValueCollection.

Mais si vous utilisez LinqBridge (pour .NET Framework 2.0 avec C # 3.0) , ce problème est facilement résolu avec LINQ comme suit:

SortedList<string, string> m = ...;
int namesFound = m.Values.Where(v => v.Contains("substring")).Count();

(si vous êtes toujours sur C # 2.0, vous pouvez utiliser LINQ du pauvre homme. à la place, avec un peu plus de travail)

Dommage que vous soyez en .Net 2.0. C'est exactement ce que LINQ est pour. ;)

Vous ne pouvez pas vraiment faire cela, car FindAll () est membre de List. Vous pouvez créer une nouvelle liste sur mySortedList.Values, mais cela semble être un gaspillage, puisqu'un nouvel objet et un tableau sous-jacent doivent être alloués uniquement pour appeler une fonction.

J'écrirais simplement une fonction utilitaire dans une classe pour les listes appelée FindAll (), puis transmettrais votre IList et votre délégué.

    static void Main(string[] args)
    {
        string someName = "two";
        SortedList<string, string> mySortedList = new SortedList<string,string>()
        {
            {"key1", "This is key one"},
            {"key2", "This is key two"},
            {"key3", "This is key three"},
        };

        int namesFound = mySortedList.Values.Where(i => i.Contains(someName)).Count();
        Console.WriteLine(namesFound);
        Console.ReadKey();
    }

Dans Framework 2.0, vous pouvez peut-être faire ceci:

    static void Main(string[] args)
    {
        string someName = "two";
        SortedList<string, string> mySortedList = new SortedList<string,string>()
        {
            {"key1", "This is key one"},
            {"key2", "This is key two"},
            {"key3", "This is key three"},
        };

        int namesFound = FindAll(mySortedList.Values, someName).Count ;
        Console.WriteLine(namesFound);
        Console.ReadKey();
    }
    public static IList<String> FindAll(IList<String> items, string item)
    {
        List<String> result = new List<string>();
        foreach (String s in items)
        {
            if (s.Contains(item))
            {
                result.Add(s);
            }
        }
        return result;
    }

Mais c’est ce que vous ne vouliez vraiment pas faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top