1

私は、C# 2.0/.NET 2.0 の問題に取り組んでいます。Sortedlist があり、この SortedList のすべての「値」(「キー」ではない) を特定の部分文字列で検索し、出現回数を数えたいと考えています。 .

これは私がやろうとしていることです:

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

mySortedList.Values は IList を返しますが、"myValues" はリストであるため、当然、これは機能しません。myValues で受け入れられるように IList を「キャスト」しようとしましたが、うまくいかないようです。

もちろん、「foreach」ループで mySortedList.Values をループすることはできますが、実際にはそうしたくありません。

誰にも提案はありますか?

EDIT-1: わかりました。これを簡単に行うためのネイティブな方法はないようです。何かが欠けているだけだと思っていましたが、どうやらそうではないようです。したがって、IList に対して "foreach" を実行するだけだと思います。

フィードバックありがとうございます。すべてのフィードバックが良いと思ったので、全員に 1 票を投じました。再度、感謝します!:-)

EDIT-2: 探していた答えが CMS にあるようです。これに関する唯一の注意点 (Qwertie が指摘したように) は、すべての値を別のリストにコピーし、そのリストを最初から最後まで検索する必要があるため、パフォーマンスが低下する可能性があることです。したがって、短いリストの場合、この答えは効果的です。長いリスト?まあ、それはあなた次第です...

4

5 に答える 5

2

IList インターフェイスはIEnumerableを実装しているため、実際には以下List<T>を使用して値を取得できList<T> (IEnumerable) Constructorます。

List<string> myValues = new List<string>(mySortedList.Values);
于 2009-03-06T01:35:51.723 に答える
2

Values プロパティを List<string> にキャストすることはできません。List<string> ではないためです。これは Dictionary<TKey, TValue>.ValueCollection です。

ただし、LinqBridge (C# 3.0 を使用する .NET Framework 2.0 用) を使用する場合、この問題は次のように LINQ で簡単に解決できます。

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

(まだ C# 2.0 を使用している場合は、代わりにPoor-man's LINQを使用できますが、もう少し作業が必要です)

于 2009-03-06T01:08:36.330 に答える
1

あなたが.Net 2.0にいるのは残念です。これはまさにLINQの目的です。;)

FindAll() は List のメンバーであるため、実際にはこれを行うことはできません。mySortedList.Values で新しい List を作成することもできますが、関数を呼び出すためだけに新しいオブジェクトと基になる配列を割り当てる必要があるため、無駄に思えます。

FindAll() という名前のリストのクラスにユーティリティ関数を記述し、IList とデリゲートを渡します。

于 2009-03-06T01:03:10.757 に答える
1
    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();
    }

Framework 2.0 では、おそらくこれを行うことができます。

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

しかし、それはあなたが本当にやりたくなかったことです。

于 2009-03-06T01:06:19.830 に答える
1

はもう試しましSortedListGetValueListか?これIListにより、値が返されます。

于 2009-03-06T01:08:29.120 に答える