私は、さまざまな UserControl (ログイン、設定) を持つことができるHashSet
ジェネリック型を持っています。UserControl
セットに特定のタイプのオブジェクトが含まれているかどうかを確認したい(ログインなど)。もしそうなら、私はその要素を取得したい。
ループを使用するのは非常に簡単ですが、もっと良い方法はありますか?
残念ながら、コレクションのすべての要素を試してそれらの型を確認する必要があるため、ループなしでは実行できません。実際、ハッシュ セットを持っているかどうかは問題ではありません。リストやその他の列挙型でも同じように機能します。ただし、LINQ では次のようにループを非表示にできます。
var item = hashSet.OfType<DesiredType>().FirstOrDefault();
@dasblinkenlight が言うようOfType<T>()
に、LINQ メソッドを使用してループを非表示にできます。彼の答えもFirstOrDefault()
メソッドを使用しているため、「要素が含まれていますか?」質問は「is not null」に言い換えられます。別の方法は、Count() > 0
afterを使用することOfType<T>()
です。
var items = hashSet.OfType<DesiredType>();
if (items.Count() > 0) {
DesiredType item = items.First();
...
}
3 番目の方法は、メソッドに述語を入れることFirstOrDefault()
です。
var item = hashSet.FirstOrDefault(x =>
x.getType() == typeof(DesiredType)
);
if (item != null) {
...
}
セットがそれほど頻繁に変更されない場合は、 を使用GroupBy(func)
して計算の複雑さをO(1)に減らすことができます。アイデアは、辞書を一度構築し、代わりにクエリを実行することです。
var groups = new Dictionary<Type, IEnumerable<UserControl>>();
foreach(var group in hashSet.GroupBy(x => x.GetType()))
groups.Add(group.Key, group);
.
.
.
if (groups.ContainsKey(typeof(DesiredType)) {
DesiredType item = items.First();
...
}