1

私はForEachWithIndexEMを持っています

static void ForEachWithIndex<T>(this IEnumerable<T> enu, Action<T, int> action)
{
    int i = 0;
    foreach(T item in enu)
        action(item, i++);
}

私はこう呼んでいます

my_int_array.ForEachWithIndex((x, i) => x += i);

今、条件をチェックしてそのアクションを実行するものを作成したいと思います。

通常、私は上記のように使用します

my_int_array.ForEachWithIndex((x,i) => 
{
    if (x != 0)
        x += i;
});

その条件をパラメータとして取るEMも欲しいです。どうやってするか?

4

3 に答える 3

3

すべてを実行する 1 つの大きな拡張メソッドを作成することは避けようとします。LINQ と同じように、分解してみましょう。

個人的には、実際にこれを行うことはありません-LINQでクエリをforeach作成し、アクションにステートメントを使用します:

// Assuming you want the *original* indexes
var query = array.Select((Value, Index) => new { value, Index })
                 .Where(pair => pair.Index != 0);

foreach (var pair in query)
{
    // Do something
}

ラムダ パラメーターをインクリメントしても実際には何も達成されないため、何をしようとしているのかを正確に知ることは困難です。ただし、ブロックを構成することを考えることを強くお勧めします... vsに関するEric Lippert の見解がforeachForEach興味深いと思われるかもしれません。

于 2012-05-16T07:12:55.693 に答える
1

条件デリゲートをパラメータリストに追加するだけです。

static void ForEachWithIndexWithCondition<T>(this IEnumerable<T> enu, 
                     Func<T, int, bool> condition, Action<T, int> action)
{
    int i = 0;
    foreach (T item in enu)
    {
        if (condition(item, i))
            action(item, i);
        i++;
     }
}

使用法:

        var list = new List<string> { "Jonh", "Mary", "Alice", "Peter" };

        list.ForEachWithIndexWithCondition(
            (s, i) => i % 2 == 0,
            (s, i) => Console.WriteLine(s));
于 2012-05-16T07:15:00.217 に答える
0

次のような追加の Func パラメータを渡す必要があります。

public static void ForEachWithIndex<T>(this IEnumerable<T> enu,
                           Action<T, int> action, Func<T, int, bool> condition)
{
    int i = 0;
    foreach (T item in enu)
    {
        if (condition(item, i))
        {
            action(item, i);
        }
        ++i;
    }
}

そして、これはあなたの例のコードがどのように見えるかです:

my_int_array.ForEachWithIndex((x, i) => x += i, (x, i) => x != 0);
于 2012-05-16T07:27:37.780 に答える