IEnumerableコレクションに述語を満たすX以上の要素があるかどうかを確認する最適な方法は何ですか?LINQ Count(predicate)> limitの代わりに(predicate、limit)拡張子を使用していますか?
私は現在.Count(lambda) <= limit
を使用していますが、これによりプログラムが不必要に全コレクションにわたって反復されます。
IEnumerableコレクションに述語を満たすX以上の要素があるかどうかを確認する最適な方法は何ですか?LINQ Count(predicate)> limitの代わりに(predicate、limit)拡張子を使用していますか?
私は現在.Count(lambda) <= limit
を使用していますが、これによりプログラムが不必要に全コレクションにわたって反復されます。
あなたは、いくつかの拡張メソッドを定義することができます。その後、
static bool LessThan<T>(this IEnumerable<T> enumerable, int count, Func<T, bool> predicate)
{
int found = 0;
foreach (var item in enumerable)
{
if (predicate(item))
{
found++;
if (found >= count)
return false;
}
}
return true;
}
static bool MoreThan<T>(this IEnumerable<T> enumerable, int count, Func<T, bool> predicate)
{
int found = 0;
foreach (var item in enumerable)
{
if (predicate(item))
{
found++;
if (found > count)
return true;
}
}
return false;
}
などのようにそれらを使用します。
var col = new[] { 1, 6, 4, 8, 3, 5, 1, 7 };
var res1 = col.MoreThan(2, c => c == 1); //false
var res2 = col.MoreThan(1, c => c == 1); //true
var res3 = col.LessThan(4, c => c > 5); //true
var res4 = col.LessThan(3, c => c > 5); //false
この式は、.Skip(limit).Any()
相当のCount() > limit
です。しかし、あなたのリストがICollection
なら、Count()
がより好ましい。
述語のバージョン:
public static bool MoreThan<TSource>(this IEnumerable<TSource> source,
Func<TSource, bool> predicate, int limit)
{
int i = 0;
foreach (var item in source)
{
if (predicate(item))
{
i++;
if (i > limit)
{
return true;
}
}
}
return false;
}
1:それは私のアプローチよりはましです。 –
@ダニエル、ありがとう! –
いい実装、ありがとう。 –
非常に良いですが、最初は(found> count)、2番目は(found> = count)でなければなりません。 –
これは、一致する要素の量が探している量と等しい場合にtrueを返します。これは、 "LessThan"と "MoreThan"という名前には意味がありません。 – Kylar