如何创建For_Each_With_Condition_With_Index扩展方法 (EM)
本文关键字:With Condition Index 方法 EM 扩展 创建 For 何创建 Each | 更新日期: 2023-09-27 18:34:14
我有一个ForEachWithIndex
EM
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。怎么做?
我会尽量避免构建一个可以完成所有操作的大型扩展方法。打破它,就像 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)对foreach
与ForEach
的看法很有趣。
只需将条件委托添加到参数列表中:
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));
您需要传递一个额外的 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);