IList< T>でFindAll()を実行するにはどうすればよいですか? (例:SortedList.Values)
-
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が指摘したように)これに関する唯一の注意点は、すべての値を別のリストにコピーし、そのリストを最初から最後まで検索する必要があるため、パフォーマンスが低下する可能性があることです。短いリストの場合、この答えは効果的です。長いリスト?決定するのはあなた次第です...
解決
IListインターフェイス IEnumerable を実装し、 List&lt; T&gt; を取得できます。 rel = "nofollow noreferrer"> List&lt; T&gt; (IEnumerable)コンストラクター
:
List<string> myValues = new List<string>(mySortedList.Values);
他のヒント
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;
}
しかし、それはあなたが本当にやりたくないことです。