次の拡張メソッドがあります。
public static IEnumerable<T> Apply<T>(
[NotNull] this IEnumerable<T> source,
[NotNull] Action<T> action)
where T : class
{
source.CheckArgumentNull("source");
action.CheckArgumentNull("action");
return source.ApplyIterator(action);
}
private static IEnumerable<T> ApplyIterator<T>(this IEnumerable<T> source, Action<T> action)
where T : class
{
foreach (var item in source)
{
action(item);
yield return item;
}
}
シーケンスの各アイテムにアクションを適用してから、それを返します。
このメソッドにPure
(Resharperアノテーションからの)属性を適用する必要があるかどうか疑問に思っていました。そのためと反対の引数を確認できます。
長所:
- 厳密に言えば、それは純粋です。シーケンスでそれを呼び出すだけでは、シーケンスは変更されません(新しいシーケンスが返されます)、または監視可能な状態の変更は行われません
- 結果を使用せずに呼び出すと、シーケンスが列挙されない限り効果がないため、間違いです。その場合は、Resharperに警告を表示します。
短所:
- にもかかわらず、
Apply
この方法自体は、得られた配列は、列挙、純粋であろう(この方法の点で)観察状態を変更します。たとえば、items.Apply(i => i.Count++)
列挙されるたびにアイテムの値を変更します。したがって、Pure属性を適用すると誤解を招く可能性があります...
どう思いますか?属性を適用する必要がありますか?