Frage

Ich bin auf ein problem in C# 2.0/.NET 2.0, wo ich habe eine Sortedlist und wollen zu suchen alle die "Werte" (nicht die "Schlüssel") dieser SortedList für einen bestimmten Teilstring und zählen, wie viele vorkommen es gibt.

Dies ist, was ich versuche zu tun:

{
   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;
}

Natürlich, dies funktioniert nicht, da mySortedList.Werte gibt eine IList, während "myValues" ist eine Liste.Ich habe versucht, "Guss", die die IList-so, dass es würde werden akzeptiert durch myValues, aber es scheint nicht zu funktionieren.

Natürlich kann ich Schleife über mySortedList.Werte in einer "foreach" - Schleife, aber ich weiß nicht wirklich wollen, dies zu tun.

Jemand irgendwelche Vorschläge?

EDIT-1:Ok, gut, es sieht aus wie es ist nicht eine native Möglichkeit, dies zu tun leicht.Ich hatte angenommen, dass ich nur etwas fehlt, aber scheinbar bin ich nicht.Also, ich denke, ich werde einfach tun, ein "foreach" über die IList.

Vielen Dank für das feedback everyone!Ich habe alle bis 1, weil ich dachte, das feedback war gut.Nochmals vielen Dank!:-)

EDIT-2:Sieht aus wie CMS hat die Antwort, die ich suchte.Der einzige Nachteil bei diesem (wie Qwertie hingewiesen wird, dass es ist eine potenzielle Leistungseinbußen, da es sich um das kopieren aller Werte einer anderen Liste und dann die Suche, die Liste-start-to-finish.So für kurz-Listen, die diese Antwort ist wirksam.Mehr Listen?nun, das ist bis zu Ihnen zu entscheiden...

War es hilfreich?

Lösung

Da die IList-Schnittstelle implementiert IEnumerable, Sie können tatsächlich eine List<T> von Werten mit dem List<T> (IEnumerable) Constructor:

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

Andere Tipps

Sie kann nicht cast die Werte, die Eigenschaft zur Liste<string> denn es ist keine Liste<string>- es ist ein Wörterbuch<TKey, TValue="">.ValueCollection.

Aber wenn Sie verwenden LinqBridge (für .NET Framework 2.0 mit C# 3.0), dieses problem ist leicht zu lösen mit LINQ wie folgt:

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

(wenn Sie immer noch auf C# 2.0, können Sie Sie nutzen Poor-man ' s LINQ stattdessen mit etwas mehr Arbeit)

Schade, dass Sie sind in .Net 2.0.Dies ist genau das, was LINQ ist.;)

Sie können nicht wirklich tun, denn FindAll() ist ein Mitglied der Liste.Sie könnten eine neue Liste erstellen, auf der mySortedList.Werte, aber es scheint eine Verschwendung, da ein neues Objekt und die zugrunde liegenden array-muss zugewiesen werden, nur um eine Funktion aufzurufen.

Ich würde einfach schreiben, eine utility-Funktion in einer Klasse für Listen genannt FindAll() und übergeben Sie dann Ihre IList und delegieren.

Haben Sie versucht, SortedList's GetValueList noch?Diese werden geben Sie zurück ein IList Werte.

    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();
    }

In Framework 2.0, vielleicht können Sie dies tun:

    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;
    }

Aber das ist, was Sie wirklich nicht tun möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top