2011-07-26 9 views

答えて

2

あなたは、いくつかの拡張メソッドを定義することができます。その後、

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 
+0

非常に良いですが、最初は(found> count)、2番目は(found> = count)でなければなりません。 –

+0

これは、一致する要素の量が探している量と等しい場合にtrueを返します。これは、 "LessThan"と "MoreThan"という名前には意味がありません。 – Kylar

7

この式は、.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; 
} 
+0

1:それは私のアプローチよりはましです。 –

+0

@ダニエル、ありがとう! –

+0

いい実装、ありがとう。 –

関連する問題