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

我会尽量避免构建一个可以完成所有工作的大型扩展方法。打破它,就像 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
}

很难确切知道您要做什么,因为增加 lambda 参数不会真正实现任何目标。不过,我强烈建议您考虑编写积木……您可能会发现Eric Lippert 对vs的看法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 回答