IList< T>でFindAll()を実行するにはどうすればよいですか? (例:SortedList.Values)

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

  •  03-07-2019
  •  | 
  •  

質問

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を返すため、これは機能しませんが、&quot; myValues&quot;リストです。 「キャスト」を試しました。 myValuesで受け入れられるようにIListを作成しますが、機能していないようです。

もちろん、「foreach」でmySortedList.Valuesをループできます。ループしますが、私はこれを本当にやりたくありません。

提案はありますか?

EDIT-1:わかりました。これを簡単に行うネイティブな方法がないようです。私は何かが足りないと思っていましたが、明らかにそうではありません。だから私はただ「foreach」をするつもりだと思う。 IListを介して。

皆さんのフィードバックに感謝します!すべてのフィードバックが良かったと思ったので、私は全員に1票を投じました。再度、感謝します! :-)

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

役に立ちましたか?

他のヒント

ValuesプロパティをList&lt; string&gt;にキャストすることはできません。 List&lt; string&gt;ではないため、Dictionary&lt; TKey、TValue&gt; .ValueCollectionです。

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

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

(まだC#2.0を使用している場合は、貧乏人のLINQを使用できます。 代わりに、少し作業が増えます)

.Net 2.0を使用しているのは残念です。これがまさにLINQの目的です。 ;)

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

FindAll()と呼ばれるリストのクラスでユーティリティ関数を作成し、IListとデリゲートを渡します。

SortedList GetValueList はまだですか?これにより、値の IList が返されます。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top